@@ -31,6 +31,12 @@ struct MarschnerLookupBSDF{
3131 float TTpower;
3232 float TRTpower;
3333 float density;
34+ // Options
35+ bool r;
36+ bool tt;
37+ bool trt;
38+ bool localScatter;
39+ bool globalScatter;
3440};
3541
3642// Longitudinal TERM (Gaussian Distribution)
@@ -102,23 +108,21 @@ vec3 computeHairShadow(LightUniform light,int lightId, sampler2DArray shadowMap,
102108
103109
104110vec3 evalMarschnerLookupBSDF(
105- vec3 wi, // Light vector
106- vec3 v, // View vector
107- vec3 irradiance,
111+ vec3 wi, // Light vector
112+ vec3 v, // View vector
113+ vec3 irradiance, // Li
108114 MarschnerLookupBSDF bsdf,
115+ // LUTs
109116 sampler2D texN,
110117 sampler2D texNTRT,
111118 sampler3D texGI,
112119 sampler2D texGI_M,
113120 sampler2D texGI_N,
114121 sampler2D texGI_NTRT,
122+ // Factors
115123 vec3 transDirect,
116124 vec3 spread,
117- float directFraction,
118- bool r,
119- bool tt,
120- bool trt,
121- bool scatter)
125+ float directFraction)
122126 {
123127
124128 // Theta
@@ -163,53 +167,55 @@ vec3 evalMarschnerLookupBSDF(
163167 float MTT = M(thH - TT_SHIFT ,TT_DEV);
164168 float MTRT = M(thH - TRT_SHIFT ,TRT_DEV);
165169
166- float R = r ? MR * NR * bsdf.Rpower : 0.0 ;
167- vec3 TT = tt ? MTT * NTT * bsdf.TTpower : vec3 (0.0 );
168- vec3 TRT = trt ? MTRT * NTRT * bsdf.TRTpower: vec3 (0.0 );
170+ float R = bsdf. r ? MR * NR * bsdf.Rpower : 0.0 ;
171+ vec3 TT = bsdf. tt ? MTT * NTT * bsdf.TTpower : vec3 (0.0 );
172+ vec3 TRT = bsdf. trt ? MTRT * NTRT * bsdf.TRTpower: vec3 (0.0 );
169173
170174 vec3 color = R+ TT+ TRT;
171175
172- if (scatter){
173176 // ////////////////////////////////////////////////////////////////////////
174177 // Local Scattering
175178 // ////////////////////////////////////////////////////////////////////////
176-
179+ vec3 gi = vec3 ( 0.0 );
177180 float ix_thH = thH * ONE_OVER_PI * 0.5 + 0.5 ;
178181 vec3 ix_spread = sqrt (spread) * ONE_OVER_PI* 0.5 ;
179182
180- vec3 gi;
181- gi.r = DENSITY * texture( texGI, vec3 ( ix_spread.r, 1 - ix_thH, ix_th ) ).r;
182- gi.g = DENSITY * texture( texGI, vec3 ( ix_spread.g, 1 - ix_thH, ix_th ) ).g;
183- gi.b = DENSITY * texture( texGI, vec3 ( ix_spread.b, 1 - ix_thH, ix_th ) ).b;
183+ if (bsdf.localScatter){
184+
184185
185- color += gi;
186- color *= directFraction;
186+ gi.r = DENSITY * texture( texGI, vec3 ( ix_spread.r, 1 - ix_thH, ix_th ) ).r;
187+ gi.g = DENSITY * texture( texGI, vec3 ( ix_spread.g, 1 - ix_thH, ix_th ) ).g;
188+ gi.b = DENSITY * texture( texGI, vec3 ( ix_spread.b, 1 - ix_thH, ix_th ) ).b;
187189
190+ color += gi;
191+ color *= directFraction;
192+
193+ }
188194 // ////////////////////////////////////////////////////////////////////////
189195 // Global Scattering
190196 // ////////////////////////////////////////////////////////////////////////
197+ if (bsdf.globalScatter){
191198
192- vec3 trans = transDirect - directFraction;
199+ vec3 trans = transDirect - directFraction;
193200
194- // N
195- vec4 N_GI = texture(texGI_N, index1 );
196- float NR_GI = N_GI.a;
197- vec3 NTT_GI = N_GI.rgb;
198- vec3 NTRT_GI = texture(texGI_NTRT, index2 ).rgb;
201+ // N
202+ vec4 N_GI = texture(texGI_N, index1 );
203+ float NR_GI = N_GI.a;
204+ vec3 NTT_GI = N_GI.rgb;
205+ vec3 NTRT_GI = texture(texGI_NTRT, index2 ).rgb;
199206
200- // M
201- vec3 M_GIr = texture(texGI_M, vec2 (ix_spread.r, 1 - ix_thH) ).xyz;
202- vec3 M_GIg = texture(texGI_M, vec2 (ix_spread.g, 1 - ix_thH) ).xyz;
203- vec3 M_GIb = texture(texGI_M, vec2 (ix_spread.b, 1 - ix_thH) ).xyz;
207+ // M
208+ vec3 M_GIr = texture(texGI_M, vec2 (ix_spread.r, 1 - ix_thH) ).xyz;
209+ vec3 M_GIg = texture(texGI_M, vec2 (ix_spread.g, 1 - ix_thH) ).xyz;
210+ vec3 M_GIb = texture(texGI_M, vec2 (ix_spread.b, 1 - ix_thH) ).xyz;
204211
205- vec3 MR_GI = vec3 ( M_GIr.x, M_GIg.x, M_GIb.x );
206- vec3 MTT_GI = vec3 ( M_GIr.y, M_GIg.y, M_GIb.y );
207- vec3 MTRT_GI = vec3 ( M_GIr.z, M_GIg.z, M_GIb.z );
212+ vec3 MR_GI = vec3 ( M_GIr.x, M_GIg.x, M_GIb.x );
213+ vec3 MTT_GI = vec3 ( M_GIr.y, M_GIg.y, M_GIb.y );
214+ vec3 MTRT_GI = vec3 ( M_GIr.z, M_GIg.z, M_GIb.z );
208215
209- vec3 f_indir = trans * DENSITY * ( gi + MR_GI* NR_GI + MTT_GI* NTT_GI + MTRT_GI* NTRT_GI ); // N components already divided by PI
210- color += f_indir;
216+ vec3 f_indir = trans * DENSITY * ( gi + MR_GI* NR_GI + MTT_GI* NTT_GI + MTRT_GI* NTRT_GI ); // N components already divided by PI
217+ color += f_indir;
211218
212- // color += gi * 0.1;
213219 }
214220 // ////////////////////////////////////////////////////////////////////////
215221
0 commit comments