37
37
vec3 EvalDielectricReflection(State state, vec3 V, vec3 N, vec3 L, vec3 H, inout float pdf)
38
38
// -----------------------------------------------------------------------
39
39
{
40
- if (! (dot (N, L) * dot (N, V) > 0.0 ))
41
- {
42
- pdf = 0 ;
40
+ pdf = 0.0 ;
41
+ if (dot (N, L) <= 0.0 )
43
42
return vec3 (0.0 );
44
- }
45
43
46
44
float F = DielectricFresnel(dot (V, H), state.eta);
47
45
float D = GTR2(dot (N, H), state.mat.roughness);
@@ -56,11 +54,9 @@ vec3 EvalDielectricReflection(State state, vec3 V, vec3 N, vec3 L, vec3 H, inout
56
54
vec3 EvalDielectricRefraction(State state, vec3 V, vec3 N, vec3 L, vec3 H, inout float pdf)
57
55
// -----------------------------------------------------------------------
58
56
{
59
- if (dot (N, L) > 0.0 )
60
- {
61
- pdf = 0 ;
62
- return vec3 (0.0 );
63
- }
57
+ pdf = 0.0 ;
58
+ if (dot (N, L) >= 0.0 )
59
+ return vec3 (0.0 );
64
60
65
61
float F = DielectricFresnel(abs (dot (V, H)), state.eta);
66
62
float D = GTR2(dot (N, H), state.mat.roughness);
@@ -76,11 +72,9 @@ vec3 EvalDielectricRefraction(State state, vec3 V, vec3 N, vec3 L, vec3 H, inout
76
72
vec3 EvalSpecular(State state, vec3 Cspec0, vec3 V, vec3 N, vec3 L, vec3 H, inout float pdf)
77
73
// -----------------------------------------------------------------------
78
74
{
79
- if (! (dot (N, L) * dot (N, V) > 0.0 ))
80
- {
81
- pdf = 0 ;
82
- return vec3 (0.0 );
83
- }
75
+ pdf = 0.0 ;
76
+ if (dot (N, L) <= 0.0 )
77
+ return vec3 (0.0 );
84
78
85
79
float D = GTR2(dot (N, H), state.mat.roughness);
86
80
pdf = D * dot (N, H) / (4.0 * dot (V, H));
@@ -95,11 +89,9 @@ vec3 EvalSpecular(State state, vec3 Cspec0, vec3 V, vec3 N, vec3 L, vec3 H, inou
95
89
vec3 EvalClearcoat(State state, vec3 V, vec3 N, vec3 L, vec3 H, inout float pdf)
96
90
// -----------------------------------------------------------------------
97
91
{
98
- if (! (dot (N, L) * dot (N, V) > 0.0 ))
99
- {
100
- pdf = 0 ;
101
- return vec3 (0.0 );
102
- }
92
+ pdf = 0.0 ;
93
+ if (dot (N, L) <= 0.0 )
94
+ return vec3 (0.0 );
103
95
104
96
float D = GTR1(dot (N, H), mix (0.1 , 0.001 , state.mat.clearcoatGloss));
105
97
pdf = D * dot (N, H) / (4.0 * dot (V, H));
@@ -114,11 +106,9 @@ vec3 EvalClearcoat(State state, vec3 V, vec3 N, vec3 L, vec3 H, inout float pdf)
114
106
vec3 EvalDiffuse(State state, vec3 Csheen, vec3 V, vec3 N, vec3 L, vec3 H, inout float pdf)
115
107
// -----------------------------------------------------------------------
116
108
{
117
- if (! (dot (N, L) * dot (N, V) > 0.0 ))
118
- {
119
- pdf = 0 ;
120
- return vec3 (0.0 );
121
- }
109
+ pdf = 0.0 ;
110
+ if (dot (N, L) <= 0.0 )
111
+ return vec3 (0.0 );
122
112
123
113
pdf = dot (N, L) * (1.0 / PI);
124
114
@@ -164,7 +154,7 @@ vec3 DisneySample(inout State state, vec3 V, vec3 N, inout vec3 L, inout float p
164
154
vec3 H = ImportanceSampleGTR2(state.mat.roughness, r1, r2);
165
155
H = state.tangent * H.x + state.bitangent * H.y + N * H.z;
166
156
167
- if (dot (N , H) < 0.0 )
157
+ if (dot (V , H) < 0.0 )
168
158
H = - H;
169
159
170
160
vec3 R = reflect (- V, H);
@@ -208,7 +198,7 @@ vec3 DisneySample(inout State state, vec3 V, vec3 N, inout vec3 L, inout float p
208
198
vec3 H = ImportanceSampleGTR2(state.mat.roughness, r1, r2);
209
199
H = state.tangent * H.x + state.bitangent * H.y + N * H.z;
210
200
211
- if (dot (N , H) < 0.0 )
201
+ if (dot (V , H) < 0.0 )
212
202
H = - H;
213
203
214
204
L = normalize (reflect (- V, H));
@@ -221,7 +211,7 @@ vec3 DisneySample(inout State state, vec3 V, vec3 N, inout vec3 L, inout float p
221
211
vec3 H = ImportanceSampleGTR1(mix (0.1 , 0.001 , state.mat.clearcoatGloss), r1, r2);
222
212
H = state.tangent * H.x + state.bitangent * H.y + N * H.z;
223
213
224
- if (dot (N , H) < 0.0 )
214
+ if (dot (V , H) < 0.0 )
225
215
H = - H;
226
216
227
217
L = normalize (reflect (- V, H));
@@ -242,14 +232,14 @@ vec3 DisneyEval(State state, vec3 V, vec3 N, vec3 L, inout float pdf)
242
232
// -----------------------------------------------------------------------
243
233
{
244
234
vec3 H;
245
- bool refl = dot (N, L) * dot (N, V) > 0.0 ;
235
+ bool refl = dot (N, L) > 0.0 ;
246
236
247
237
if (refl)
248
238
H = normalize (L + V);
249
239
else
250
- H = normalize (L * ( 1.0 / state.eta) + V );
240
+ H = normalize (L + V * state.eta);
251
241
252
- if (dot (N , H) < 0.0 )
242
+ if (dot (V , H) < 0.0 )
253
243
H = - H;
254
244
255
245
float diffuseRatio = 0.5 * (1.0 - state.mat.metallic);
0 commit comments