renderPalette = function (
composer,
defaultAmplitude = 1,
defaultPalette = 0,
components = "x"
) {
const { GPUProgram, FLOAT, INT } = gpuio;
return new GPUProgram(composer, {
name: "renderPalette",
fragmentShader: `
in vec2 v_uv;
uniform sampler2D u_state;
uniform float u_amplitude;
uniform int u_palette;
out vec4 out_color;
const vec3 table[32] = vec3[32](vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,1.0,1.0),vec3(1.0,1.0,1.0),
vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,1.0,1.0),vec3(0.0,0.33,0.67),
vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,1.0,1.0),vec3(0.0,0.10,0.20),
vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,1.0,1.0),vec3(0.3,0.20,0.20),
vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,1.0,0.5),vec3(0.8,0.90,0.30),
vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(1.0,0.7,0.4),vec3(0.0,0.15,0.20),
vec3(0.5,0.5,0.5),vec3(0.5,0.5,0.5),vec3(2.0,1.0,0.0),vec3(0.5,0.20,0.25),
vec3(0.8,0.5,0.4),vec3(0.2,0.4,0.2),vec3(2.0,1.0,1.0),vec3(0.0,0.25,0.25)
);
vec3 pal( in float t, in int i )
{
vec3 a = table[i*4];
vec3 b = table[i*4+1];
vec3 c = table[i*4+2];
vec3 d = table[i*4+3];
return a + b*cos( 3.1416*(c*t+d) );
}
void main() {
float val = u_amplitude * texture(u_state, v_uv).${components} ;
vec3 col = pal(val, u_palette);
out_color = vec4(col, 1);
}
`,
uniforms: [
{
name: "u_amplitude",
value: defaultAmplitude,
type: FLOAT
},
{
name: "u_palette",
value: defaultPalette,
type: INT
}
]
});
}