|
|
- Shader "Hidden/Post FX/Lut Generator"
- {
- CGINCLUDE
-
- #pragma target 3.0
- #pragma multi_compile __ TONEMAPPING_NEUTRAL TONEMAPPING_FILMIC
-
- #include "UnityCG.cginc"
- #include "ACES.cginc"
- #include "Common.cginc"
- #include "ColorGrading.cginc"
- #include "Tonemapping.cginc"
-
- half3 _Balance;
-
- half3 _Lift;
- half3 _InvGamma;
- half3 _Gain;
-
- half3 _Offset;
- half3 _Power;
- half3 _Slope;
-
- half _HueShift;
- half _Saturation;
- half _Contrast;
-
- half3 _ChannelMixerRed;
- half3 _ChannelMixerGreen;
- half3 _ChannelMixerBlue;
-
- half4 _NeutralTonemapperParams1;
- half4 _NeutralTonemapperParams2;
-
- sampler2D _Curves;
-
- half4 _LutParams;
-
- half3 ColorGrade(half3 color)
- {
- half3 aces = unity_to_ACES(color);
-
- // ACEScc (log) space
- half3 acescc = ACES_to_ACEScc(aces);
-
- acescc = OffsetPowerSlope(acescc, _Offset, _Power, _Slope);
-
- half2 hs = RgbToHsv(acescc).xy;
- half satMultiplier = SecondaryHueSat(hs.x, _Curves);
- satMultiplier *= SecondarySatSat(hs.y, _Curves);
- satMultiplier *= SecondaryLumSat(AcesLuminance(acescc), _Curves);
-
- acescc = Saturation(acescc, _Saturation * satMultiplier);
- acescc = ContrastLog(acescc, _Contrast);
-
- aces = ACEScc_to_ACES(acescc);
-
- // ACEScg (linear) space
- half3 acescg = ACES_to_ACEScg(aces);
-
- acescg = WhiteBalance(acescg, _Balance);
- acescg = LiftGammaGain(acescg, _Lift, _InvGamma, _Gain);
-
- half3 hsv = RgbToHsv(max(acescg, 0.0));
- hsv.x = SecondaryHueHue(hsv.x + _HueShift, _Curves);
- acescg = HsvToRgb(hsv);
-
- acescg = ChannelMixer(acescg, _ChannelMixerRed, _ChannelMixerGreen, _ChannelMixerBlue);
-
- #if TONEMAPPING_FILMIC
-
- aces = ACEScg_to_ACES(acescg);
- color = FilmicTonemap(aces);
-
- #elif TONEMAPPING_NEUTRAL
-
- color = ACEScg_to_unity(acescg);
- color = NeutralTonemap(color, _NeutralTonemapperParams1, _NeutralTonemapperParams2);
-
- #else
-
- color = ACEScg_to_unity(acescg);
-
- #endif
-
- // YRGB curves (done in linear/LDR for now)
- color = YrgbCurve(color, _Curves);
-
- return color;
- }
-
- half4 FragCreateLut(VaryingsDefault i) : SV_Target
- {
- // 2D strip lut
- half2 uv = i.uv - _LutParams.yz;
- half3 color;
- color.r = frac(uv.x * _LutParams.x);
- color.b = uv.x - color.r / _LutParams.x;
- color.g = uv.y;
-
- // Lut is in LogC
- half3 colorLogC = color * _LutParams.w;
-
- // Switch back to unity linear and color grade
- half3 colorLinear = LogCToLinear(colorLogC);
- half3 graded = ColorGrade(colorLinear);
-
- return half4(graded, 1.0);
- }
-
- ENDCG
-
- SubShader
- {
- Cull Off ZWrite Off ZTest Always
-
- // (0)
- Pass
- {
- CGPROGRAM
-
- #pragma vertex VertDefault
- #pragma fragment FragCreateLut
-
- ENDCG
- }
- }
- }
|