X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=gamma_compression_effect.frag;h=a72a878c84720c1d0bc53274e429a4d7af0659ca;hp=27e014e1182bc30d1b6a0abde0a3055c75e28bf1;hb=3306a4a0d2300767eeef71ab877fdf1587d13475;hpb=6eb839737216564bcaf4645b7ebf6ea9efc2da09 diff --git a/gamma_compression_effect.frag b/gamma_compression_effect.frag index 27e014e..a72a878 100644 --- a/gamma_compression_effect.frag +++ b/gamma_compression_effect.frag @@ -1,11 +1,25 @@ -// Compress to sRGB gamma curve. +// Compress gamma curve. + +// Implicit uniforms: +// uniform float PREFIX(linear_scale); +// uniform float PREFIX(c)[5]; +// uniform float PREFIX(beta); vec4 FUNCNAME(vec2 tc) { vec4 x = INPUT(tc); - x.r = texture1D(PREFIX(compression_curve_tex), x.r).x; - x.g = texture1D(PREFIX(compression_curve_tex), x.g).x; - x.b = texture1D(PREFIX(compression_curve_tex), x.b).x; + // We could reasonably get values outside (0.0, 1.0), but the formulas below + // are not valid outside that range, so clamp before we do anything else. + x.rgb = clamp(x.rgb, 0.0, 1.0); + + vec3 a = x.rgb * PREFIX(linear_scale); + + // Fourth-order polynomial approximation to pow(). See the .cpp file for details. + vec3 s = sqrt(x.rgb); + vec3 b = PREFIX(c)[0] + (PREFIX(c)[1] + (PREFIX(c)[2] + (PREFIX(c)[3] + PREFIX(c)[4] * s) * s) * s) * s; + + vec3 f = vec3(greaterThan(x.rgb, vec3(PREFIX(beta)))); + x = vec4(mix(a, b, f), x.a); return x; }