Skip to content

Commit 830f46c

Browse files
committed
mat compiler: Fix pdf to account for transmission
1 parent 5bc48a3 commit 830f46c

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

include/irr/builtin/material_compiler/glsl/common.glsl

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
867867
const bool is_bsdf = !op_isBRDF(op) && !is_coat;
868868
const vec3 albedo = params_getReflectance(params);
869869

870-
float pdf = 1.0;
870+
float localPdf = 1.0;
871871
vec3 rem = vec3(1.0);
872872
uint ndf = instr_getNDF(instr);
873873
irr_glsl_LightSample s;
@@ -881,7 +881,7 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
881881
s = irr_glsl_createLightSample(-precomp.V, -1.0, currInteraction.T, currInteraction.B, currInteraction.isotropic.N);
882882
out_microfacet = irr_glsl_calcAnisotropicMicrofacetCache(currInteraction, s);
883883
rem = vec3(1.0);
884-
pdf = irr_glsl_FLT_INF;
884+
localPdf = irr_glsl_FLT_INF;
885885
} else
886886
#endif
887887
#ifdef OP_THINDIELECTRIC
@@ -890,7 +890,7 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
890890
const vec3 luminosityContributionHint = CIE_XYZ_Luma_Y_coeffs;
891891
s = irr_glsl_thin_smooth_dielectric_cos_generate(currInteraction, u, ior2[0], luminosityContributionHint);
892892
out_microfacet = irr_glsl_calcAnisotropicMicrofacetCache(currInteraction, s);
893-
rem = irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf(pdf, s, currInteraction.isotropic, ior2[0], luminosityContributionHint);
893+
rem = irr_glsl_thin_smooth_dielectric_cos_remainder_and_pdf(localPdf, s, currInteraction.isotropic, ior2[0], luminosityContributionHint);
894894
} else
895895
#endif
896896
#if defined(OP_DIFFUSE) || defined(OP_DIFFTRANS)
@@ -908,8 +908,8 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
908908
s = irr_glsl_createLightSampleTangentSpace(localV, localL, tangentFrame);
909909
out_microfacet = irr_glsl_calcAnisotropicMicrofacetCache(currInteraction, s);
910910

911-
rem *= albedo*irr_glsl_oren_nayar_cos_remainder_and_pdf(pdf, s, currInteraction.isotropic, ax2);
912-
pdf *= is_bsdf ? 0.5 : 1.0;
911+
rem *= albedo*irr_glsl_oren_nayar_cos_remainder_and_pdf(localPdf, s, currInteraction.isotropic, ax2);
912+
localPdf *= is_bsdf ? 0.5 : 1.0;
913913
} else
914914
#endif
915915
#if defined(OP_CONDUCTOR) || defined(OP_DIELECTRIC)
@@ -953,7 +953,7 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
953953
END_CASES
954954

955955
vec3 localL;
956-
float VdotH = dot(localH, localV);
956+
const float VdotH = dot(localH, localV);
957957
vec3 fr;
958958
bool refraction = false;
959959
#ifdef OP_CONDUCTOR
@@ -970,7 +970,7 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
970970
const float refractionProb = colorToScalar(fr);
971971
float rcpChoiceProb;
972972
refraction = irr_glsl_partitionRandVariable(refractionProb, u.z, rcpChoiceProb);
973-
pdf /= rcpChoiceProb;
973+
localPdf /= rcpChoiceProb;
974974
}
975975
float eta = colorToScalar(ior[0]);
976976
float rcpEta = 1.0/eta;
@@ -1017,14 +1017,18 @@ irr_glsl_LightSample irr_bsdf_cos_generate(in MC_precomputed_t precomp, in instr
10171017
{}
10181018
END_CASES
10191019

1020+
const float LdotH = out_microfacet.isotropic.LdotH;
1021+
const float VdotHLdotH = VdotH * LdotH;
1022+
// a trick, pdf was already multiplied by transmission/reflection choice probability above
1023+
const float reflectance = refraction ? 0.0 : 1.0;
10201024
rem *= G2_over_G1;
1021-
pdf *= irr_glsl_smith_VNDF_pdf_wo_clamps(ndf_val, G1_over_2NdotV);
1025+
localPdf *= irr_glsl_smith_VNDF_pdf_wo_clamps(ndf_val, G1_over_2NdotV, NdotV, refraction, VdotH, LdotH, VdotHLdotH, eta, reflectance);
10221026
} else
10231027
#endif
10241028
{} //empty braces for `else`
10251029

10261030
out_remainder = rem;
1027-
out_pdf *= pdf;
1031+
out_pdf *= localPdf;
10281032

10291033
return s;
10301034
}

0 commit comments

Comments
 (0)