X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=gamma_expansion_effect.cpp;h=15e0bffb8f03ed0a1bf034c29b9fbbcd6245be38;hp=696815ed40273ea9fb8daab2e2a1d29bff30684b;hb=f705cd2a092c0f41603f0d4d619f72dbde476212;hpb=9651a4eaae012cdc49c1aa38197861e04f62e91e diff --git a/gamma_expansion_effect.cpp b/gamma_expansion_effect.cpp index 696815e..15e0bff 100644 --- a/gamma_expansion_effect.cpp +++ b/gamma_expansion_effect.cpp @@ -6,10 +6,19 @@ using namespace std; +namespace movit { + GammaExpansionEffect::GammaExpansionEffect() : source_curve(GAMMA_LINEAR) { 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("beta", &uniform_beta); } string GammaExpansionEffect::output_fragment_shader() @@ -38,7 +47,7 @@ void GammaExpansionEffect::set_gl_state(GLuint glsl_program_num, const string &p // However, pow() is relatively slow in GLSL, so we approximate this // part by a minimax polynomial, whose coefficients are precalculated // in Maple. (It is very hard to accurately model the curve as a whole - // using minimax polynomials; both Maple and Mathematically generally + // using minimax polynomials; both Maple and Mathematica generally // just error out if you ask them to optimize over 0..1 with a higher-degree // polynomial.) // @@ -78,13 +87,13 @@ void GammaExpansionEffect::set_gl_state(GLuint glsl_program_num, const string &p // // Note that the worst _relative_ error by far is just at the beginning // of the exponential curve, ie., just around β. - set_uniform_float(glsl_program_num, prefix, "linear_scale", 1.0 / 12.92); - set_uniform_float(glsl_program_num, prefix, "c0", 0.001324469581); - set_uniform_float(glsl_program_num, prefix, "c1", 0.02227416690); - set_uniform_float(glsl_program_num, prefix, "c2", 0.5917615253); - set_uniform_float(glsl_program_num, prefix, "c3", 0.4733532353); - set_uniform_float(glsl_program_num, prefix, "c4", -0.08880738120); - set_uniform_float(glsl_program_num, prefix, "beta", 0.04045); + 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_beta = 0.04045; } if (source_curve == GAMMA_REC_709) { // Also includes Rec. 601, and 10-bit Rec. 2020. // Rec. 2020, page 3; ɑ = 1.099, β = 0.018 * 4.5, ɣ = 1/0.45. @@ -95,13 +104,13 @@ void GammaExpansionEffect::set_gl_state(GLuint glsl_program_num, const string &p // Note that Rec. 2020 only gives the other direction, which is why // our beta and gamma are different from the numbers mentioned // (we've inverted the formula). - set_uniform_float(glsl_program_num, prefix, "linear_scale", 1.0 / 4.5); - set_uniform_float(glsl_program_num, prefix, "c0", 0.005137028744); - set_uniform_float(glsl_program_num, prefix, "c1", 0.09802596889); - set_uniform_float(glsl_program_num, prefix, "c2", 0.7255768864); - set_uniform_float(glsl_program_num, prefix, "c3", 0.2135067966); - set_uniform_float(glsl_program_num, prefix, "c4", -0.04225094667); - set_uniform_float(glsl_program_num, prefix, "beta", 0.018 * 4.5); + 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_beta = 0.018 * 4.5; } if (source_curve == GAMMA_REC_2020_12_BIT) { // Rec. 2020, page 3; ɑ = 1.0993, β = 0.0181 * 4.5, ɣ = 1/0.45. @@ -112,12 +121,14 @@ void GammaExpansionEffect::set_gl_state(GLuint glsl_program_num, const string &p // Note that Rec. 2020 only gives the other direction, which is why // our beta and gamma are different from the numbers mentioned // (we've inverted the formula). - set_uniform_float(glsl_program_num, prefix, "linear_scale", 1.0 / 4.5); - set_uniform_float(glsl_program_num, prefix, "c0", 0.005167545928); - set_uniform_float(glsl_program_num, prefix, "c1", 0.09835585809); - set_uniform_float(glsl_program_num, prefix, "c2", 0.7254820139); - set_uniform_float(glsl_program_num, prefix, "c3", 0.2131291155); - set_uniform_float(glsl_program_num, prefix, "c4", -0.04213877222); - set_uniform_float(glsl_program_num, prefix, "beta", 0.0181 * 4.5); + 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_beta = 0.0181 * 4.5; } } + +} // namespace movit