@@ -9,7 +9,9 @@ void instr_eval_execute(in instr_t instr, in MC_precomputed_t precomp, inout irr
9
9
const bool is_bxdf = op_isBXDF(op);
10
10
const bool is_bsdf = ! op_isBRDF(op); // note it actually tells if op is BSDF or BUMPMAP or SET_GEOM_NORMAL (divergence reasons)
11
11
const float cosFactor = irr_glsl_conditionalAbsOrMax(is_bsdf, s.NdotL, 0.0 );
12
- const bool positiveCosFactor = cosFactor > FLT_MIN;
12
+ const float NdotV = irr_glsl_conditionalAbsOrMax(is_bsdf, currInteraction.isotropic.NdotV, 0.0 );
13
+ bool is_valid = (NdotV > FLT_MIN);
14
+ const bool positiveCosFactor = cosFactor > FLT_MIN && is_valid;
13
15
const bool is_bxdf_or_combiner = op_isBXDForCoatOrBlend(op);
14
16
15
17
uvec3 regs = instr_decodeRegisters(instr);
@@ -19,7 +21,7 @@ void instr_eval_execute(in instr_t instr, in MC_precomputed_t precomp, inout irr
19
21
irr_glsl_AnisotropicMicrofacetCache microfacet;
20
22
bsdf_data_t bsdf_data;
21
23
22
- const bool run = ! skip;
24
+ const bool run = ! skip && positiveCosFactor ;
23
25
24
26
if (run && is_bxdf_or_combiner)
25
27
{
@@ -29,16 +31,13 @@ void instr_eval_execute(in instr_t instr, in MC_precomputed_t precomp, inout irr
29
31
params = instr_getParameters(instr, bsdf_data);
30
32
}
31
33
32
- bxdf_eval_t bxdf_eval = bxdf_eval_t(0.0 );
34
+ bxdf_eval_t result = bxdf_eval_t(0.0 );
33
35
34
- if (run && is_bxdf && positiveCosFactor )
36
+ if (run && is_bxdf)
35
37
{
36
38
const float eta = colorToScalar(ior[0 ]);
37
39
const float rcp_eta = 1.0 / eta;
38
40
39
- const float NdotV = irr_glsl_conditionalAbsOrMax(is_bsdf, currInteraction.isotropic.NdotV, 0.0 );
40
-
41
- bool is_valid = (NdotV > FLT_MIN);
42
41
bool refraction = false;
43
42
#ifdef OP_DIELECTRIC
44
43
if (op == OP_DIELECTRIC && irr_glsl_isTransmissionPath(currInteraction.isotropic.NdotV, s.NdotL))
@@ -59,7 +58,7 @@ void instr_eval_execute(in instr_t instr, in MC_precomputed_t precomp, inout irr
59
58
#if defined(OP_DIFFUSE) || defined(OP_DIFFTRANS)
60
59
if (op_isDiffuse(op))
61
60
{
62
- bxdf_eval = albedo * irr_glsl_oren_nayar_cos_eval(s, currInteraction.isotropic, a2);
61
+ result = albedo * irr_glsl_oren_nayar_cos_eval(s, currInteraction.isotropic, a2);
63
62
}
64
63
else
65
64
#endif
@@ -131,14 +130,13 @@ void instr_eval_execute(in instr_t instr, in MC_precomputed_t precomp, inout irr
131
130
END_CASES
132
131
133
132
float VdotH = microfacet.isotropic.VdotH;
134
- float VdotH_clamp = irr_glsl_conditionalAbsOrMax(is_bsdf, VdotH, 0.0 );
135
133
vec3 fr;
136
134
#ifdef OP_CONDUCTOR
137
135
if (op == OP_CONDUCTOR)
138
- fr = irr_glsl_fresnel_conductor(ior[0 ], ior[1 ], VdotH_clamp );
136
+ fr = irr_glsl_fresnel_conductor(ior[0 ], ior[1 ], VdotH );
139
137
else
140
138
#endif
141
- fr = irr_glsl_fresnel_dielectric_common(ior2[0 ], VdotH_clamp );
139
+ fr = irr_glsl_fresnel_dielectric_common(ior2[0 ], VdotH );
142
140
143
141
#ifdef OP_DIELECTRIC
144
142
if (is_bsdf)
@@ -153,13 +151,12 @@ void instr_eval_execute(in instr_t instr, in MC_precomputed_t precomp, inout irr
153
151
bxdf_eval_scalar_part = irr_glsl_microfacet_to_light_measure_transform(bxdf_eval_scalar_part, NdotV, refraction, VdotH, LdotH, VdotHLdotH, eta);
154
152
}
155
153
#endif
156
- bxdf_eval = fr * bxdf_eval_scalar_part;
154
+ result = fr * bxdf_eval_scalar_part;
157
155
} else
158
156
#endif
159
157
{}
160
158
}
161
159
162
- bxdf_eval_t result = bxdf_eval;
163
160
if (! is_bxdf)
164
161
{
165
162
mat2x4 srcs = instr_fetchSrcRegs(instr, regs);
0 commit comments