自行编写着色器

用于特效的着色器是片元着色器。你可以自行编写着色器并将其附加于谱面压缩包中。在 shader 字段,你需要填写 /shader路径。注意这里的 / 是必不可少的,它将内置着色器和自定义着色器区分开来。

为保证兼容性,着色器版本要求为 GLSL 1.00。

内置变量

prpr 为着色器内置了如下变量:

varying vec2 uv; // 材质 UV
uniform vec2 screenSize; // 屏幕大小(注意是整个屏幕,并不只是谱面部分)
uniform sampler2D screenTexture; // 屏幕材质(同样也是整个屏幕的材质)
uniform float time; // 谱面时间,以秒为单位

还有一些变量是虽然存在,但在片元着色器中使用无意义的。在定义自己的变量时,你应该避免与它们重名:

uniform mat4 Model;
uniform mat4 Projection;
uniform vec2 UVScale;

着色器变量

为了在谱面中可以指定参数,你需要这样定义你的着色器 uniform 变量:

uniform type name; // %def%

其中 type 为类型,目前支持 floatvec2vec4name 为变量名;def 为默认值。三个都是不可缺少的。

示例

下面的示例着色器将会根据 factor 的值给屏幕叠加上强弱不等的红色:

#version 100
precision mediump float;

varying lowp vec2 uv;
uniform sampler2D screenTexture;

uniform float factor; // %0.5% 0..1

void main() {
  gl_FragColor = mix(texture2D(screenTexture, uv), vec4(1.0, 0.0, 0.0, 1.0), factor);
}