precision mediump float; varying vec2 fragTexCoord; varying vec4 fragColor; uniform sampler2D texture0; vec3 srgb_to_linear(vec3 c) { bvec3 cutoff = lessThanEqual(c, vec3(0.04045)); vec3 low = c / 12.92; vec3 high = pow((c + 0.055) / 1.055, vec3(2.4)); return mix(high, low, vec3(cutoff)); } void main() { vec4 c = texture2D(texture0, fragTexCoord) * fragColor; c.rgb = srgb_to_linear(c.rgb); // decode to linear gl_FragColor = c; }