fragmentShader = {
const shader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(shader, `
precision highp float;
uniform sampler2D u_image;
uniform vec2 u_size;
uniform vec3 u_weight;
float rgb_lrgb(float v) {
return v <= 0.04045 ? v / 12.92 : pow((v + 0.055) / 1.055, 2.4);
}
float lrgb_rgb(float v) {
return v <= 0.0031308 ? 12.92 * v : 1.055 * pow(v, 1.0 / 2.4) - 0.055;
}
vec3 rgb_lrgb(vec3 v) {
return vec3(rgb_lrgb(v.r), rgb_lrgb(v.g), rgb_lrgb(v.b));
}
void main() {
float x = gl_FragCoord.x / u_size.x;
float y = 1.0 - gl_FragCoord.y / u_size.y;
vec3 rgb = u_weight * rgb_lrgb(texture2D(u_image, vec2(x, y)).rgb);
gl_FragColor = vec4(vec3(lrgb_rgb(rgb.r + rgb.g + rgb.b)), 1.0);
}
`);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
throw new Error(gl.getShaderInfoLog(shader));
}
return shader;
}