X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=gamma_compression_effect.cpp;h=0f0a2e4c73e031f930a243b9f661de1d830c7702;hp=5a76ec35556f1e6bfa1a801de36bf4aefbd6edb5;hb=a22465673fce8a9db2cf88bccbee72db0e5b4c5e;hpb=ca8d64aa3d306d31f53979ba95b3f9afdf6e4d92 diff --git a/gamma_compression_effect.cpp b/gamma_compression_effect.cpp index 5a76ec3..0f0a2e4 100644 --- a/gamma_compression_effect.cpp +++ b/gamma_compression_effect.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include "gamma_compression_effect.h" @@ -7,18 +9,38 @@ GammaCompressionEffect::GammaCompressionEffect() : destination_curve(GAMMA_LINEAR) { register_int("destination_curve", (int *)&destination_curve); + memset(compression_curve, 0, sizeof(compression_curve)); + register_1d_texture("compression_curve_tex", compression_curve, COMPRESSION_CURVE_SIZE); } -std::string GammaCompressionEffect::output_glsl() +std::string GammaCompressionEffect::output_fragment_shader() { - switch (destination_curve) { - case GAMMA_LINEAR: - return read_file("identity.glsl"); - case GAMMA_sRGB: - return read_file("gamma_compression_effect_srgb.glsl"); - case GAMMA_REC_709: // and GAMMA_REC_601 - return read_file("gamma_compression_effect_rec709.glsl"); - default: - assert(false); + if (destination_curve == GAMMA_LINEAR) { + return read_file("identity.frag"); } + if (destination_curve == GAMMA_sRGB) { + for (unsigned i = 0; i < COMPRESSION_CURVE_SIZE; ++i) { + float x = i / (float)(COMPRESSION_CURVE_SIZE - 1); + if (x < 0.0031308f) { + compression_curve[i] = 12.92f * x; + } else { + compression_curve[i] = 1.055f * pow(x, 1.0f / 2.4f) - 0.055f; + } + } + invalidate_1d_texture("compression_curve_tex"); + return read_file("gamma_compression_effect.frag"); + } + if (destination_curve == GAMMA_REC_709) { // And Rec. 601. + for (unsigned i = 0; i < COMPRESSION_CURVE_SIZE; ++i) { + float x = i / (float)(COMPRESSION_CURVE_SIZE - 1); + if (x < 0.018f) { + compression_curve[i] = 4.5f * x; + } else { + compression_curve[i] = 1.099f * pow(x, 0.45f) - 0.099; + } + } + invalidate_1d_texture("compression_curve_tex"); + return read_file("gamma_compression_effect.frag"); + } + assert(false); }