| | |
| | | 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 |
| | | } |
| | | } |
| | | } |
| | | 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
|
| | | }
|
| | | }
|
| | | }
|