case GAMMA_sRGB:
return read_file("gamma_compression_effect_srgb.glsl");
case GAMMA_REC_709: // and GAMMA_REC_601
- // Not implemented yet.
- assert(false);
+ return read_file("gamma_compression_effect_rec709.glsl");
default:
assert(false);
}
--- /dev/null
+// Compress to Rec. 601/Rec. 709 gamma curve.
+
+#if 0
+
+// if we have the lut
+uniform sampler1D PREFIX(rec709_inverse_tex);
+
+vec4 FUNCNAME(vec2 tc) {
+ vec4 x = LAST_INPUT(tc);
+
+ x.r = texture1D(PREFIX(rec709_inverse_tex), x.r).x;
+ x.g = texture1D(PREFIX(rec709_inverse_tex), x.g).x;
+ x.b = texture1D(PREFIX(rec709_inverse_tex), x.b).x;
+
+ return x;
+}
+
+#else
+
+// use arithmetic (slow)
+vec4 FUNCNAME(vec2 tc) {
+ vec4 x = LAST_INPUT(tc);
+
+ vec3 a = vec3(4.5) * x.rgb;
+ vec3 b = vec3(1.099) * pow(x.rgb, vec3(0.45)) - vec3(0.099);
+ vec3 f = vec3(greaterThan(x.rgb, vec3(0.018)));
+
+ return vec4(mix(a, b, f), x.a);
+}
+
+#endif
#if 0
// if we have the lut
-uniform sampler1D PREFIX(srgb_tex);
+uniform sampler1D PREFIX(srgb_inverse_tex);
vec4 FUNCNAME(vec2 tc) {
vec4 x = LAST_INPUT(tc);
- x.r = texture1D(PREFIX(srgb_tex), x.r).x;
- x.g = texture1D(PREFIX(srgb_tex), x.g).x;
- x.b = texture1D(PREFIX(srgb_tex), x.b).x;
+ x.r = texture1D(PREFIX(srgb_inverse_tex), x.r).x;
+ x.g = texture1D(PREFIX(srgb_inverse_tex), x.g).x;
+ x.b = texture1D(PREFIX(srgb_inverse_tex), x.b).x;
return x;
}
case GAMMA_sRGB:
return read_file("gamma_expansion_effect_srgb.glsl");
case GAMMA_REC_709: // and GAMMA_REC_601
- // Not implemented yet.
- assert(false);
+ return read_file("gamma_expansion_effect_rec709.glsl");
default:
assert(false);
}
--- /dev/null
+// Expand Rec. 601/Rec. 709 gamma curve.
+
+#if 0
+
+// if we have the lut
+uniform sampler1D PREFIX(rec709_tex);
+
+vec4 FUNCNAME(vec2 tc) {
+ vec4 x = LAST_INPUT(tc);
+
+ x.r = texture1D(PREFIX(rec709_tex), x.r).x;
+ x.g = texture1D(PREFIX(rec709_tex), x.g).x;
+ x.b = texture1D(PREFIX(rec709_tex), x.b).x;
+
+ return x;
+}
+
+#else
+
+// use arithmetic (slow)
+vec4 FUNCNAME(vec2 tc) {
+ vec4 x = LAST_INPUT(tc);
+
+ vec3 a = x.rgb * vec3(1.0/4.500);
+ vec3 b = pow((x.rgb + vec3(0.099)) * vec3(1.0/1.099), vec3(1.0/0.45));
+ vec3 f = vec3(greaterThan(x.rgb, vec3(0.081)));
+
+ return vec4(mix(a, b, f), x.a);
+}
+
+#endif