Skip to content

Commit 8001fbf

Browse files
fixed NaNs on inconsistent shading normals
1 parent 134550d commit 8001fbf

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

include/nbl/builtin/glsl/material_compiler/common.glsl

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,18 +1053,26 @@ vec3 nbl_glsl_MC_runGenerateAndRemainderStream(in nbl_glsl_MC_precomputed_t prec
10531053
nbl_glsl_MC_microfacet_t microfacet;
10541054
uint generator_rnpOffset;
10551055
nbl_glsl_LightSample s = nbl_bsdf_cos_generate(precomp, gcs, rand, generator_rem, generator_pdf, microfacet, generator_rnpOffset);
1056+
10561057
nbl_glsl_MC_eval_and_pdf_t eval_pdf = nbl_bsdf_eval_and_pdf(precomp, rnps, generator_rnpOffset, s, microfacet);
1057-
nbl_glsl_MC_bxdf_eval_t acc = eval_pdf.rgb;
1058-
float restPdf = eval_pdf.a;
1059-
float pdf = generator_pdf + restPdf;
1058+
const vec3 restEval = eval_pdf.rgb;
1059+
const float restPdf = eval_pdf.a;
10601060

10611061
out_smpl = s;
1062-
out_pdf = pdf;
1062+
out_pdf = restPdf;
10631063

1064-
float rcp_generator_pdf = 1.0 / generator_pdf;
1065-
vec3 rem = (generator_rem + acc*rcp_generator_pdf) / (1.0 + restPdf*rcp_generator_pdf);
1064+
vec3 num = restEval;
1065+
float den = restPdf;
1066+
if (generator_pdf>FLT_MIN)
1067+
{
1068+
out_pdf += generator_pdf;
1069+
// guaranteed less than INF
1070+
const float rcp_generator_pdf = 1.0/generator_pdf;
10661071

1067-
return rem;
1072+
num = num*rcp_generator_pdf+generator_rem;
1073+
den = den*rcp_generator_pdf+1.0;
1074+
}
1075+
return out_pdf>FLT_MIN ? (num/den):vec3(0.0);
10681076
}
10691077

10701078
#endif //GEN_CHOICE_STREAM

0 commit comments

Comments
 (0)