{
register_int("destination_curve", (int *)&destination_curve);
register_uniform_float("linear_scale", &uniform_linear_scale);
- register_uniform_float("c0", &uniform_c0);
- register_uniform_float("c1", &uniform_c1);
- register_uniform_float("c2", &uniform_c2);
- register_uniform_float("c3", &uniform_c3);
- register_uniform_float("c4", &uniform_c4);
+ register_uniform_float_array("c", uniform_c, 5);
register_uniform_float("beta", &uniform_beta);
}
// maxerror = 0.000785 = 0.200 * 255
// error at 1.0 = 0.000078 = 0.020 * 255
uniform_linear_scale = 12.92;
- uniform_c0 = -0.03679675939;
- uniform_c1 = 1.443803073;
- uniform_c2 = -0.9239780987;
- uniform_c3 = 0.8060491596;
- uniform_c4 = -0.2891558568;
+ uniform_c[0] = -0.03679675939;
+ uniform_c[1] = 1.443803073;
+ uniform_c[2] = -0.9239780987;
+ uniform_c[3] = 0.8060491596;
+ uniform_c[4] = -0.2891558568;
uniform_beta = 0.0031308;
}
if (destination_curve == GAMMA_REC_709) { // Also includes Rec. 601, and 10-bit Rec. 2020.
// maxerror = 0.000131 = 0.033 * 255 = 0.134 * 1023
// error at 1.0 = 0.000013 = 0.003 * 255 = 0.013 * 1023
uniform_linear_scale = 4.5;
- uniform_c0 = -0.08541688528;
- uniform_c1 = 1.292793370;
- uniform_c2 = -0.4070417645;
- uniform_c3 = 0.2923891828;
- uniform_c4 = -0.09273699351;
+ uniform_c[0] = -0.08541688528;
+ uniform_c[1] = 1.292793370;
+ uniform_c[2] = -0.4070417645;
+ uniform_c[3] = 0.2923891828;
+ uniform_c[4] = -0.09273699351;
uniform_beta = 0.018;
}
if (destination_curve == GAMMA_REC_2020_12_BIT) {
// from 0.553 to 0.501; adding a fifth order can get it down to
// 0.167, although this assumes working in fp64 and not fp32.)
uniform_linear_scale = 4.5;
- uniform_c0 = -0.08569685663;
- uniform_c1 = 1.293000900;
- uniform_c2 = -0.4067291321;
- uniform_c3 = 0.2919741179;
- uniform_c4 = -0.09256205770;
+ uniform_c[0] = -0.08569685663;
+ uniform_c[1] = 1.293000900;
+ uniform_c[2] = -0.4067291321;
+ uniform_c[3] = 0.2919741179;
+ uniform_c[4] = -0.09256205770;
uniform_beta = 0.0181;
}
}
// Implicit uniforms:
// uniform float PREFIX(linear_scale);
-// uniform float PREFIX(c0), PREFIX(c1), PREFIX(c2), PREFIX(c3), PREFIX(c4);
+// uniform float PREFIX(c)[5];
// uniform float PREFIX(beta);
vec4 FUNCNAME(vec2 tc) {
// Fourth-order polynomial approximation to pow(). See the .cpp file for details.
vec3 s = sqrt(x.rgb);
- vec3 b = PREFIX(c0) + (PREFIX(c1) + (PREFIX(c2) + (PREFIX(c3) + PREFIX(c4) * s) * s) * s) * s;
+ 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);
private:
GammaCurve destination_curve;
- float uniform_linear_scale, uniform_c0, uniform_c1, uniform_c2, uniform_c3, uniform_c4, uniform_beta;
+ float uniform_linear_scale, uniform_c[5], uniform_beta;
};
} // namespace movit
{
register_int("source_curve", (int *)&source_curve);
register_uniform_float("linear_scale", &uniform_linear_scale);
- register_uniform_float("c0", &uniform_c0);
- register_uniform_float("c1", &uniform_c1);
- register_uniform_float("c2", &uniform_c2);
- register_uniform_float("c3", &uniform_c3);
- register_uniform_float("c4", &uniform_c4);
+ register_uniform_float_array("c", uniform_c, 5);
register_uniform_float("beta", &uniform_beta);
}
// Note that the worst _relative_ error by far is just at the beginning
// of the exponential curve, ie., just around β.
uniform_linear_scale = 1.0 / 12.92;
- uniform_c0 = 0.001324469581;
- uniform_c1 = 0.02227416690;
- uniform_c2 = 0.5917615253;
- uniform_c3 = 0.4733532353;
- uniform_c4 = -0.08880738120;
+ uniform_c[0] = 0.001324469581;
+ uniform_c[1] = 0.02227416690;
+ uniform_c[2] = 0.5917615253;
+ uniform_c[3] = 0.4733532353;
+ uniform_c[4] = -0.08880738120;
uniform_beta = 0.04045;
}
if (source_curve == GAMMA_REC_709) { // Also includes Rec. 601, and 10-bit Rec. 2020.
// our beta and gamma are different from the numbers mentioned
// (we've inverted the formula).
uniform_linear_scale = 1.0 / 4.5;
- uniform_c0 = 0.005137028744;
- uniform_c1 = 0.09802596889;
- uniform_c2 = 0.7255768864;
- uniform_c3 = 0.2135067966;
- uniform_c4 = -0.04225094667;
+ uniform_c[0] = 0.005137028744;
+ uniform_c[1] = 0.09802596889;
+ uniform_c[2] = 0.7255768864;
+ uniform_c[3] = 0.2135067966;
+ uniform_c[4] = -0.04225094667;
uniform_beta = 0.018 * 4.5;
}
if (source_curve == GAMMA_REC_2020_12_BIT) {
// our beta and gamma are different from the numbers mentioned
// (we've inverted the formula).
uniform_linear_scale = 1.0 / 4.5;
- uniform_c0 = 0.005167545928;
- uniform_c1 = 0.09835585809;
- uniform_c2 = 0.7254820139;
- uniform_c3 = 0.2131291155;
- uniform_c4 = -0.04213877222;
+ uniform_c[0] = 0.005167545928;
+ uniform_c[1] = 0.09835585809;
+ uniform_c[2] = 0.7254820139;
+ uniform_c[3] = 0.2131291155;
+ uniform_c[4] = -0.04213877222;
uniform_beta = 0.0181 * 4.5;
}
}
// Implicit uniforms:
// uniform float PREFIX(linear_scale);
-// uniform float PREFIX(c0), PREFIX(c1), PREFIX(c2), PREFIX(c3), PREFIX(c4);
+// uniform float PREFIX(c)[5];
// uniform float PREFIX(beta);
vec4 FUNCNAME(vec2 tc) {
vec3 a = x.rgb * PREFIX(linear_scale);
// Fourth-order polynomial approximation to pow(). See the .cpp file for details.
- vec3 b = PREFIX(c0) + (PREFIX(c1) + (PREFIX(c2) + (PREFIX(c3) + PREFIX(c4) * x.rgb) * x.rgb) * x.rgb) * x.rgb;
+ vec3 b = PREFIX(c[0]) + (PREFIX(c[1]) + (PREFIX(c[2]) + (PREFIX(c[3]) + PREFIX(c[4]) * x.rgb) * x.rgb) * x.rgb) * x.rgb;
vec3 f = vec3(greaterThan(x.rgb, vec3(PREFIX(beta))));
x = vec4(mix(a, b, f), x.a);
private:
GammaCurve source_curve;
- float uniform_linear_scale, uniform_c0, uniform_c1, uniform_c2, uniform_c3, uniform_c4, uniform_beta;
+ float uniform_linear_scale, uniform_c[5], uniform_beta;
};
} // namespace movit