fragmentShader = {
const shader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(shader, `
precision highp float;
uniform sampler2D u_image;
uniform vec2 u_translate;
uniform float u_scale;
uniform float u_t;
const float c_pi = 3.14159265358979323846264;
vec4 color(float t) {
const float ar = 0.50, ag = 0.50, ab = 0.50;
const float br = 0.50, bg = 0.50, bb = 0.50;
const float cr = 1.00, cg = 1.00, cb = 1.00;
const float dr = 0.00, dg = 0.10, db = 0.20;
return vec4(
ar + br * cos(2.0 * c_pi * (cr * t + dr)),
ag + bg * cos(2.0 * c_pi * (cg * t + dg)),
ab + bb * cos(2.0 * c_pi * (cb * t + db)),
1.0
);
}
void main(void) {
const int n = ${N};
const float step = c_pi / float(n);
vec2 p = (gl_FragCoord.xy - u_translate) / u_scale;
float alpha;
for (int i = 0; i < n; i++) {
float theta = float(i) * step;
alpha += cos(cos(theta) * p.x + sin(theta) * p.y + u_t);
}
gl_FragColor = color(alpha * 2.0 / float(n));
}
`);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader));
return shader;
}