@@ -50,7 +50,7 @@ float FresnelMix(Material mat, float eta, float VDotH)
50
50
return mix (dielectricFresnel, metallicFresnel, mat.metallic);
51
51
}
52
52
53
- vec3 EvalDiffuse(Material mat, vec3 Csheen, vec3 V, vec3 L, vec3 H, inout float pdf)
53
+ vec3 EvalDiffuse(Material mat, vec3 Csheen, vec3 V, vec3 L, vec3 H, out float pdf)
54
54
{
55
55
pdf = 0.0 ;
56
56
if (L.z <= 0.0 )
@@ -75,7 +75,7 @@ vec3 EvalDiffuse(Material mat, vec3 Csheen, vec3 V, vec3 L, vec3 H, inout float
75
75
return (INV_PI * mix (Fd, ss, mat.subsurface) * mat.baseColor + Fsheen) * (1.0 - mat.metallic) * (1.0 - mat.specTrans);
76
76
}
77
77
78
- vec3 EvalSpecReflection(Material mat, float eta, vec3 specCol, vec3 V, vec3 L, vec3 H, inout float pdf)
78
+ vec3 EvalSpecReflection(Material mat, float eta, vec3 specCol, vec3 V, vec3 L, vec3 H, out float pdf)
79
79
{
80
80
pdf = 0.0 ;
81
81
if (L.z <= 0.0 )
@@ -92,27 +92,27 @@ vec3 EvalSpecReflection(Material mat, float eta, vec3 specCol, vec3 V, vec3 L, v
92
92
return F * D * G2 / (4.0 * L.z * V.z);
93
93
}
94
94
95
- vec3 EvalSpecRefraction(Material mat, float eta, vec3 V, vec3 L, vec3 H, inout float pdf)
95
+ vec3 EvalSpecRefraction(Material mat, float eta, vec3 V, vec3 L, vec3 H, out float pdf)
96
96
{
97
97
pdf = 0.0 ;
98
98
if (L.z >= 0.0 )
99
99
return vec3 (0.0 );
100
100
101
101
float F = DielectricFresnel(abs (dot (V, H)), eta);
102
102
float D = GTR2(H.z, mat.roughness);
103
- float denom = dot (L, H) + dot (V, H) * eta;
103
+ float denom = dot (L, H) + dot (V, H) * eta;
104
104
denom *= denom;
105
105
float G1 = SmithG(abs (V.z), mat.roughness);
106
106
float G2 = G1 * SmithG(abs (L.z), mat.roughness);
107
107
float jacobian = abs (dot (L, H)) / denom;
108
108
109
109
pdf = G1 * max (0.0 , dot (V, H)) * D * jacobian / V.z;
110
-
110
+
111
111
vec3 specColor = pow (mat.baseColor, vec3 (0.5 ));
112
112
return specColor * (1.0 - mat.metallic) * mat.specTrans * (1.0 - F) * D * G2 * abs (dot (V, H)) * abs (dot (L, H)) * eta * eta / (denom * abs (L.z) * abs (V.z));
113
113
}
114
114
115
- vec3 EvalClearcoat(Material mat, vec3 V, vec3 L, vec3 H, inout float pdf)
115
+ vec3 EvalClearcoat(Material mat, vec3 V, vec3 L, vec3 H, out float pdf)
116
116
{
117
117
pdf = 0.0 ;
118
118
if (L.z <= 0.0 )
@@ -121,15 +121,15 @@ vec3 EvalClearcoat(Material mat, vec3 V, vec3 L, vec3 H, inout float pdf)
121
121
float FH = DielectricFresnel(dot (V, H), 1.0 / 1.5 );
122
122
float F = mix (0.04 , 1.0 , FH);
123
123
float D = GTR1(H.z, mat.clearcoatRoughness);
124
- float G = SmithG(L.z, 0.25 )
125
- * SmithG(V.z, 0.25 );
124
+ float G = SmithG(L.z, 0.25 )
125
+ * SmithG(V.z, 0.25 );
126
126
float jacobian = 1.0 / (4.0 * dot (V, H));
127
127
128
128
pdf = D * H.z * jacobian;
129
129
return vec3 (0.25 ) * mat.clearcoat * F * D * G / (4.0 * L.z * V.z);
130
130
}
131
131
132
- void GetSpecColor(Material mat, float eta, inout vec3 specCol, inout vec3 sheenCol)
132
+ void GetSpecColor(Material mat, float eta, out vec3 specCol, out vec3 sheenCol)
133
133
{
134
134
float lum = Luminance(mat.baseColor);
135
135
vec3 ctint = lum > 0.0 ? mat.baseColor / lum : vec3 (1 .0f);
@@ -138,7 +138,7 @@ void GetSpecColor(Material mat, float eta, inout vec3 specCol, inout vec3 sheenC
138
138
sheenCol = mix (vec3 (1.0 ), ctint, mat.sheenTint);
139
139
}
140
140
141
- void GetLobeProbabilities(Material mat, float eta, vec3 specCol, float approxFresnel, inout float diffuseWt, inout float specReflectWt, inout float specRefractWt, inout float clearcoatWt)
141
+ void GetLobeProbabilities(Material mat, float eta, vec3 specCol, float approxFresnel, out float diffuseWt, out float specReflectWt, out float specRefractWt, out float clearcoatWt)
142
142
{
143
143
diffuseWt = Luminance(mat.baseColor) * (1.0 - mat.metallic) * (1.0 - mat.specTrans);
144
144
specReflectWt = Luminance(mix (specCol, vec3 (1.0 ), approxFresnel));
@@ -152,7 +152,7 @@ void GetLobeProbabilities(Material mat, float eta, vec3 specCol, float approxFre
152
152
clearcoatWt /= totalWt;
153
153
}
154
154
155
- vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
155
+ vec3 DisneySample(State state, vec3 V, vec3 N, out vec3 L, out float pdf)
156
156
{
157
157
pdf = 0.0 ;
158
158
vec3 f = vec3 (0.0 );
@@ -170,9 +170,9 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
170
170
171
171
// Lobe weights
172
172
float diffuseWt, specReflectWt, specRefractWt, clearcoatWt;
173
- // TODO: Recheck fresnel. Not sure if correct. VDotN produces fireflies with rough dielectric.
173
+ // TODO: Recheck fresnel. Not sure if correct. VDotN produces fireflies with rough dielectric.
174
174
// VDotH matches Mitsuba and gets rid of all fireflies but H isn't available at this stage
175
- float approxFresnel = FresnelMix(state.mat, state.eta, V.z);
175
+ float approxFresnel = FresnelMix(state.mat, state.eta, V.z);
176
176
GetLobeProbabilities(state.mat, state.eta, specCol, approxFresnel, diffuseWt, specReflectWt, specRefractWt, clearcoatWt);
177
177
178
178
// CDF for picking a lobe
@@ -182,7 +182,7 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
182
182
cdf[2 ] = cdf[1 ] + specRefractWt;
183
183
cdf[3 ] = cdf[2 ] + clearcoatWt;
184
184
185
- if (r1 < cdf[0 ]) // Diffuse Reflection Lobe
185
+ if (r1 < cdf[0 ]) // Diffuse Reflection Lobe
186
186
{
187
187
r1 /= cdf[0 ];
188
188
L = CosineSampleHemisphere(r1, r2);
@@ -236,7 +236,7 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
236
236
return f * abs (dot (N, L));
237
237
}
238
238
239
- vec3 DisneyEval(State state, vec3 V, vec3 N, vec3 L, inout float bsdfPdf)
239
+ vec3 DisneyEval(State state, vec3 V, vec3 N, vec3 L, out float bsdfPdf)
240
240
{
241
241
bsdfPdf = 0.0 ;
242
242
vec3 f = vec3 (0.0 );
@@ -261,8 +261,8 @@ vec3 DisneyEval(State state, vec3 V, vec3 N, vec3 L, inout float bsdfPdf)
261
261
262
262
// Lobe weights
263
263
float diffuseWt, specReflectWt, specRefractWt, clearcoatWt;
264
- float approxFresnel = FresnelMix(state.mat, state.eta, dot (V, H));
265
- GetLobeProbabilities(state.mat, state.eta, specCol, approxFresnel , diffuseWt, specReflectWt, specRefractWt, clearcoatWt);
264
+ float fresnel = FresnelMix(state.mat, state.eta, dot (V, H));
265
+ GetLobeProbabilities(state.mat, state.eta, specCol, fresnel , diffuseWt, specReflectWt, specRefractWt, clearcoatWt);
266
266
267
267
float pdf;
268
268
0 commit comments