]> git.sesse.net Git - movit/blobdiff - gamma_compression_effect.frag
Remove C++11 dependency from ResampleEffect.
[movit] / gamma_compression_effect.frag
index 8944982f6ad19c20161bcd077811b50cb20c46a5..a72a878c84720c1d0bc53274e429a4d7af0659ca 100644 (file)
@@ -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 = LAST_INPUT(tc);
+       vec4 x = INPUT(tc);
+
+       // 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;
 
-       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;
+       vec3 f = vec3(greaterThan(x.rgb, vec3(PREFIX(beta))));
+       x = vec4(mix(a, b, f), x.a);
 
        return x;
 }