1+ #include "../../tonemap.hlsl"
2+
3+ Texture2D <float4 > t1 : register (t1);
4+ Texture2D <float4 > t0 : register (t0);
5+ SamplerState s1_s : register (s1);
6+ SamplerState s0_s : register (s0);
7+ cbuffer cb0 : register (b0){
8+ float4 cb0[39 ];
9+ }
10+
11+ void main (
12+ float4 v0 : SV_POSITION0,
13+ float2 v1 : TEXCOORD0 ,
14+ float2 w1 : TEXCOORD1 ,
15+ out float4 o0 : SV_Target0 )
16+ {
17+ float4 r0,r1,r2,r3,r4,r5;
18+ uint4 bitmask, uiDest;
19+ float4 fDest;
20+
21+ r0.x = cb0[29 ].y;
22+ r1.yz = -cb0[28 ].yz + w1.xy;
23+ r2.x = cb0[28 ].x * r1.y;
24+ r1.x = frac (r2.x);
25+ r2.x = r1.x / cb0[28 ].x;
26+ r1.w = -r2.x + r1.y;
27+ r2.xyz = cb0[28 ].www * r1.xzw;
28+ r2.xyz = lutShaper (r2.xyz, true , 2 );
29+ r0.yw = float2 (0 , 0.25 );
30+ float3 preCG = renodx::color ::srgb::DecodeSafe (r2.xyz);
31+ float3 sdrColor = renodx::tonemap::renodrt::NeutralSDR (preCG);
32+ float3 userLutInput = injectedData.toneMapType == 0.f ? saturate (preCG) : sdrColor;
33+ renodx::lut::Config lut_config = renodx::lut::config::Create ();
34+ lut_config.lut_sampler = s0_s;
35+ lut_config.strength = injectedData.colorGradeUserLUTStrength;
36+ lut_config.scaling = injectedData.colorGradeUserLUTScaling;
37+ lut_config.type_input = renodx::lut::config::type::SRGB;
38+ lut_config.type_input = renodx::lut::config::type::SRGB;
39+ lut_config.precompute = cb0[29 ].xyz;
40+ lut_config.recolor = 0.f ;
41+ lut_config.max_channel = injectedData.toneMapType == 0.f ? 0.f : 1.f ;
42+ lut_config.gamut_compress = injectedData.toneMapType == 0.f ? 0.f : 1.f ;
43+ lut_config.tetrahedral = false ;
44+ r0.yw = float2 (0 ,0.25 );
45+ r3.xyz = renodx::lut::Sample (userLutInput, lut_config, t0);
46+ if (injectedData.toneMapType != 0.f ) {
47+ lut_config.strength = 1.f ;
48+ r3.xyz = renodx::tonemap::UpgradeToneMap (preCG, userLutInput, r3.xyz, injectedData.colorGradeUserLUTStrength);
49+ }
50+ preCG = r3.xyz;
51+ r3.xyz = renodx::color ::srgb::EncodeSafe (r3.xyz);
52+ r1.xyz = -r1.xzw * cb0[28 ].www + r3.xyz;
53+ r1.xyz = cb0[29 ].www * r1.xyz + r2.xyz;
54+ r1.xyz = r1.xyz * cb0[32 ].www + float3 (-0.217637643 ,-0.217637643 ,-0.217637643 );
55+ r1.xyz = r1.xyz * cb0[32 ].zzz + float3 (0.217637643 ,0.217637643 ,0.217637643 );
56+ r2.x = dot (float3 (0.390405 ,0.549941 ,0.00892632 ), r1.xyz);
57+ r2.y = dot (float3 (0.0708416 ,0.963172 ,0.00135775 ), r1.xyz);
58+ r2.z = dot (float3 (0.0231082 ,0.128021 ,0.936245 ), r1.xyz);
59+ r1.xyz = cb0[30 ].xyz * r2.xyz;
60+ r2.x = dot (float3 (2.858470 ,-1.628790 ,-0.024891 ), r1.xyz);
61+ r2.y = dot (float3 (-0.210182 ,1.158200 ,0.000324281 ), r1.xyz);
62+ r2.z = dot (float3 (-0.041812 ,-0.118169 ,1.068670 ), r1.xyz);
63+ r1.xyz = cb0[31 ].xyz * r2.xyz;
64+ r2.x = dot (r1.xyz, cb0[33 ].xyz);
65+ r2.y = dot (r1.xyz, cb0[34 ].xyz);
66+ r2.z = dot (r1.xyz, cb0[35 ].xyz);
67+ float3 preLGG = r2.xyz;
68+ r1.xyz = r2.xyz * cb0[38 ].xyz + cb0[36 ].xyz;
69+ r1.xyz = sign (r1.xyz) * pow (abs (r1.xyz), cb0[37 ].xyz);
70+ r1.xyz = liftGammaGainScaling (r1.xyz, preLGG, cb0[36 ].xyz, cb0[37 ].xyz, cb0[38 ].xyz, 2 );
71+ bool isWCG = r1.x < 0.0 || r1.y < 0.0 || r1.z < 0.0 ;
72+ if (injectedData.toneMapType != 0.f ){
73+ r1.xyz = renodx::color ::srgb::DecodeSafe (r1.xyz);
74+ r1.xyz = isWCG ? renodx::color ::bt2020::from::BT709 (r1.xyz) : r1.xyz;
75+ r1.xyz = renodx::color ::srgb::EncodeSafe (r1.xyz);
76+ }
77+ r1.xyz = max (float3 (0 ,0 ,0 ), r1.xyz);
78+ r0.x = step (r1.z, r1.y);
79+ r2.xy = r1.zy;
80+ r3.xy = -r2.xy + r1.yz;
81+ r2.zw = float2 (-1.0 , 2.0 / 3.0 );
82+ r3.zw = float2 (1 ,-1 );
83+ r2.xyzw = r0.xxxx * r3.xywz + r2.xywz;
84+ r0.x = step (r2.x, r1.x);
85+ r3.z = r2.w;
86+ r2.w = r1.x;
87+ r1.z = dot (r1.xyz, float3 (0.212672904 ,0.715152204 ,0.0721750036 ));
88+ r3.xyw = r2.wyx;
89+ r3.xyzw = r3.xyzw + -r2.xyzw;
90+ r2.xyzw = r0.xxxx * r3.xyzw + r2.xyzw;
91+ r0.x = min (r2.w, r2.y);
92+ r0.x = r2.x + -r0.x;
93+ r0.y = r0.x * 6.0 + 0.0001 ;
94+ r2.y = r2.w + -r2.y;
95+ r0.y = r2.y / r0.y;
96+ r0.y = r2.z + r0.y;
97+ r0.z = abs (r0.y);
98+ r3.xyzw = t1.SampleLevel (s1_s, r0.zw, 0 ).yxzw;
99+ r4.x = cb0[32 ].x + r0.z;
100+ r3.x = saturate (r3.x);
101+ r0.y = r3.x + r3.x;
102+ r0.z = 0.0001 + r2.x;
103+ r1.x = r0.x / r0.z;
104+ r1.yw = float2 (0.25 ,0.25 );
105+ r3.xyzw = t1.SampleLevel (s1_s, r1.xy, 0 ).zxyw;
106+ r5.xyzw = t1.SampleLevel (s1_s, r1.zw, 0 ).wxyz;
107+ r5.x = saturate (r5.x);
108+ r3.x = saturate (r3.x);
109+ r0.x = dot (r3.xx, r0.yy);
110+ r0.x = r5.x * r0.x;
111+ r0.x = dot (cb0[32 ].yy, r0.xx);
112+ r4.y = 0.25 ;
113+ r3.xyzw = t1.SampleLevel (s1_s, r4.xy, 0 ).xyzw;
114+ r3.x = saturate (r3.x);
115+ r0.y = r3.x + r4.x;
116+ r0.yzw = float3 (-0.5 ,0.5 ,-1.5 ) + r0.yyy;
117+ r0.w = r0.y > 1 ? r0.w : r0.y;
118+ r0.y = r0.y < 0 ? r0.z : r0.w;
119+ r0.yzw = float3 (1.0 , 2.0 / 3.0 , 1.0 / 3.0 ) + r0.yyy;
120+ r0.yzw = frac (r0.yzw);
121+ r0.yzw = r0.yzw * float3 (6 ,6 ,6 ) + float3 (-3 ,-3 ,-3 );
122+ r0.yzw = saturate (float3 (-1 ,-1 ,-1 ) + abs (r0.yzw));
123+ r0.yzw = float3 (-1 ,-1 ,-1 ) + r0.yzw;
124+ r0.yzw = r1.xxx * r0.yzw + float3 (1 ,1 ,1 );
125+ r1.xyz = r2.xxx * r0.yzw;
126+ r1.x = dot (r1.xyz, float3 (0.212672904 ,0.715152204 ,0.0721750036 ));
127+ r0.yzw = r2.xxx * r0.yzw + -r1.xxx;
128+ r0.xyz = r0.xxx * r0.yzw + r1.xxx;
129+ if (injectedData.toneMapType == 0.f ) {
130+ r0.xyz = saturate (r0.xyz);
131+ }
132+ float3 hdrColor = renodx::color ::srgb::DecodeSafe (r0.xyz);
133+ if (injectedData.toneMapType != 0.f ){
134+ hdrColor = isWCG ? renodx::color ::bt709::from::BT2020 (hdrColor) : hdrColor;
135+ }
136+ sdrColor = renodx::tonemap::renodrt::NeutralSDR (hdrColor);
137+ float3 curvesInput = injectedData.toneMapType <= 1.f ? hdrColor : sdrColor;
138+ r0.xyz = curvesInput;
139+ isWCG = r0.x < 0.0 || r0.y < 0.0 || r0.z < 0.0 ;
140+ if (injectedData.toneMapType != 0.f ){
141+ r0.xyz = isWCG ? renodx::color ::bt2020::from::BT709 (r0.xyz) : r0.xyz;
142+ }
143+ r0.xyz = renodx::color ::srgb::EncodeSafe (r0.xyz);
144+ r0.xyz = float3 (0.00390625 ,0.00390625 ,0.00390625 ) + r0.xyz;
145+ r0.w = 0.75 ;
146+ r1.xyzw = t1.Sample (s1_s, r0.xw).wxyz;
147+ r1.x = saturate (r1.x);
148+ r2.xyzw = t1.Sample (s1_s, r0.yw).xyzw;
149+ r0.xyzw = t1.Sample (s1_s, r0.zw).xyzw;
150+ r1.z = saturate (r0.w);
151+ r1.y = saturate (r2.w);
152+ r0.xyz = float3 (0.00390625 ,0.00390625 ,0.00390625 ) + r1.xyz;
153+ r0.w = 0.75 ;
154+ r1.xyzw = t1.Sample (s1_s, r0.xw).xyzw;
155+ o0.x = saturate (r1.x);
156+ r1.xyzw = t1.Sample (s1_s, r0.yw).xyzw;
157+ r0.xyzw = t1.Sample (s1_s, r0.zw).xyzw;
158+ o0.z = saturate (r0.z);
159+ o0.y = saturate (r1.y);
160+ o0.w = 1 ;
161+ if (injectedData.toneMapType != 0.f ) {
162+ o0.xyz = renodx::color ::srgb::Decode (o0.xyz);
163+ o0.xyz = isWCG ? renodx::color ::bt709::from::BT2020 (o0.xyz) : o0.xyz;
164+ o0.xyz = renodx::tonemap::UpgradeToneMap (hdrColor, sdrColor, o0.xyz, 1.f );
165+ o0.xyz = renodx::color ::srgb::EncodeSafe (o0.xyz);
166+ }
167+ o0.xyz = renodx::color ::srgb::DecodeSafe (o0.xyz);
168+ o0.xyz = lerp (preCG, o0.xyz, injectedData.colorGradeInternalLUTStrength);
169+ if (injectedData.tonemapCheck == 1.f && (injectedData.count2Old == injectedData.count2New)) {
170+ o0.xyz = applyUserNoTonemap (o0.xyz);
171+ }
172+ o0.xyz = renodx::color ::srgb::EncodeSafe (o0.xyz);
173+ return ;
174+ }
0 commit comments