X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=lift_gamma_gain_effect.h;h=60978f45047c3272e78662ae31f7c1e4f289eea2;hp=097195583264764189283efda1bbc5d3cdf73f81;hb=9224f01a362117deef6f1140c6802fde256fb168;hpb=bfa58911af9e945f3532a2c48306b4e9e293e0f7 diff --git a/lift_gamma_gain_effect.h b/lift_gamma_gain_effect.h index 0971955..60978f4 100644 --- a/lift_gamma_gain_effect.h +++ b/lift_gamma_gain_effect.h @@ -1,18 +1,41 @@ -#ifndef _LIFT_GAMMA_GAIN_EFFECT_H -#define _LIFT_GAMMA_GAIN_EFFECT_H 1 +#ifndef _MOVIT_LIFT_GAMMA_GAIN_EFFECT_H +#define _MOVIT_LIFT_GAMMA_GAIN_EFFECT_H 1 + +// A simple lift/gamma/gain effect, used for color grading. +// +// Very roughly speaking, lift=shadows, gamma=midtones and gain=highlights, +// although all parameters affect the entire curve. Mathematically speaking, +// it is a bit unusual to look at gamma as a color, but it works pretty well +// in practice. +// +// The classic formula is: output = (gain * (x + lift * (1-x)))^(1/gamma). +// +// The lift is actually a case where we actually would _not_ want linear light; +// since black by definition becomes equal to the lift color, we want lift to +// be pretty close to black, but in linear light that means lift affects the +// rest of the curve relatively little. Thus, we actually convert to gamma 2.2 +// before lift, and then back again afterwards. (Gain and gamma are, +// up to constants, commutative with the de-gamma operation.) +// +// Also, gamma is a case where we would not want premultiplied alpha. +// Thus, we have to divide away alpha first, and then re-multiply it back later. + +#include +#include #include "effect.h" class LiftGammaGainEffect : public Effect { public: LiftGammaGainEffect(); - std::string output_glsl(); + virtual std::string effect_type_id() const { return "LiftGammaGainEffect"; } + virtual AlphaHandling alpha_handling() const { return INPUT_PREMULTIPLIED_ALPHA_KEEP_BLANK; } + std::string output_fragment_shader(); - void set_uniforms(GLhandleARB glsl_program_num, const std::string &prefix); + void set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num); private: RGBTriplet lift, gamma, gain; - float saturation; }; -#endif // !defined(_LIFT_GAMMA_GAIN_EFFECT_H) +#endif // !defined(_MOVIT_LIFT_GAMMA_GAIN_EFFECT_H)