Skip to content

Commit bab3c0b

Browse files
Used eta for f0 and reduce code duplication
1 parent a937e04 commit bab3c0b

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

src/shaders/common/disney.glsl

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,15 @@ vec3 EvalClearcoat(Material mat, vec3 V, vec3 N, vec3 L, vec3 H, inout float pdf
113113
return vec3(0.25 * mat.clearcoat * F * D * G);
114114
}
115115

116+
void GetSpecColor(Material mat, float eta, inout vec3 specCol, inout vec3 sheenCol)
117+
{
118+
float lum = Luminance(mat.baseColor);
119+
vec3 ctint = lum > 0.0 ? mat.baseColor / lum : vec3(1.0f);
120+
float F0 = (1.0 - eta) / (1.0 + eta);
121+
specCol = mix(F0 * F0 * mix(vec3(1.0), ctint, mat.specularTint), mat.baseColor, mat.metallic);
122+
sheenCol = mix(vec3(1.0), ctint, mat.sheenTint);
123+
}
124+
116125
void GetLobeProbabilities(Material mat, float eta, vec3 specCol, float approxFresnel, inout float diffuseWt, inout float specReflectWt, inout float specRefractWt, inout float clearcoatWt)
117126
{
118127
diffuseWt = Luminance(mat.baseColor) * (1.0 - mat.metallic) * (1.0 - mat.specTrans);
@@ -135,12 +144,9 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
135144
float r1 = rand();
136145
float r2 = rand();
137146

138-
// Compute specular color
139-
float lum = Luminance(state.mat.baseColor);
140-
vec3 ctint = lum > 0.0 ? state.mat.baseColor / lum : vec3(1.0f);
141-
float F0 = state.eta < 1.0 ? (1.0 - state.mat.ior) / (1.0 + state.mat.ior) : (state.mat.ior - 1.0) / (state.mat.ior + 1.0);
142-
vec3 specCol = mix(F0 * F0 * mix(vec3(1.0), ctint, state.mat.specularTint), state.mat.baseColor, state.mat.metallic);
143-
vec3 csheen = mix(vec3(1.0), ctint, state.mat.sheenTint);
147+
// Specular and sheen color
148+
vec3 specCol, sheenCol;
149+
GetSpecColor(state.mat, state.eta, specCol, sheenCol);
144150

145151
// Lobe weights
146152
float diffuseWt, specReflectWt, specRefractWt, clearcoatWt;
@@ -165,7 +171,7 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
165171

166172
vec3 H = normalize(L + V);
167173

168-
f = EvalDiffuse(state.mat, csheen, V, N, L, H, pdf);
174+
f = EvalDiffuse(state.mat, sheenCol, V, N, L, H, pdf);
169175
pdf *= diffuseWt;
170176
}
171177
else if (r1 < cdf[1]) // Specular Reflection Lobe
@@ -174,7 +180,7 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
174180
vec3 H = SampleGTR2(state.mat.roughness, r1, r2);
175181
H = T * H.x + B * H.y + N * H.z;
176182

177-
if (dot(V, H) <= 0.0)
183+
if (dot(V, H) < 0.0)
178184
H = -H;
179185

180186
L = normalize(reflect(-V, H));
@@ -188,7 +194,7 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
188194
vec3 H = SampleGTR2(state.mat.roughness, r1, r2);
189195
H = T * H.x + B * H.y + N * H.z;
190196

191-
if (dot(V, H) <= 0.0)
197+
if (dot(V, H) < 0.0)
192198
H = -H;
193199

194200
L = normalize(refract(-V, H, state.eta));
@@ -202,7 +208,7 @@ vec3 DisneySample(State state, vec3 V, vec3 N, inout vec3 L, inout float pdf)
202208
vec3 H = SampleGTR1(state.mat.clearcoatRoughness, r1, r2);
203209
H = T * H.x + B * H.y + N * H.z;
204210

205-
if (dot(V, H) <= 0.0)
211+
if (dot(V, H) < 0.0)
206212
H = -H;
207213

208214
L = normalize(reflect(-V, H));
@@ -231,12 +237,9 @@ vec3 DisneyEval(State state, vec3 V, vec3 N, vec3 L, inout float bsdfPdf)
231237
if (dot(V, H) < 0.0)
232238
H = -H;
233239

234-
// Compute specular color
235-
float lum = Luminance(state.mat.baseColor);
236-
vec3 ctint = lum > 0.0 ? state.mat.baseColor / lum : vec3(1.0f);
237-
float F0 = state.eta < 1.0 ? (1.0 - state.mat.ior) / (1.0 + state.mat.ior) : (state.mat.ior - 1.0) / (state.mat.ior + 1.0);
238-
vec3 specCol = mix(F0 * F0 * mix(vec3(1.0), ctint, state.mat.specularTint), state.mat.baseColor, state.mat.metallic);
239-
vec3 csheen = mix(vec3(1.0), ctint, state.mat.sheenTint);
240+
// Specular and sheen color
241+
vec3 specCol, sheenCol;
242+
GetSpecColor(state.mat, state.eta, specCol, sheenCol);
240243

241244
// Lobe weights
242245
float diffuseWt, specReflectWt, specRefractWt, clearcoatWt;
@@ -248,7 +251,7 @@ vec3 DisneyEval(State state, vec3 V, vec3 N, vec3 L, inout float bsdfPdf)
248251
// Diffuse
249252
if (diffuseWt > 0.0 && NDotL > 0.0)
250253
{
251-
f += EvalDiffuse(state.mat, csheen, V, N, L, H, pdf);
254+
f += EvalDiffuse(state.mat, sheenCol, V, N, L, H, pdf);
252255
bsdfPdf += pdf * diffuseWt;
253256
}
254257

0 commit comments

Comments
 (0)