Cycles: Fixing wrong PDF evaluation when BSDF closures are excluded by the light source

Pull Request: https://projects.blender.org/blender/blender/pulls/142323
This commit is contained in:
Sebastian Herholz
2025-07-18 08:47:24 +02:00
committed by Gitea
parent a002fa5efa
commit 20e0fed7da

View File

@@ -286,12 +286,14 @@ ccl_device_inline float _surface_shader_bsdf_eval_mis(KernelGlobals kg,
}
if (CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
if (CLOSURE_IS_BSDF(sc->type) && !_surface_shader_exclude(sc->type, light_shader_flags)) {
if (CLOSURE_IS_BSDF(sc->type)) {
float bsdf_pdf = 0.0f;
const Spectrum eval = bsdf_eval(kg, sd, sc, wo, &bsdf_pdf);
if (bsdf_pdf != 0.0f) {
bsdf_eval_accum(result_eval, sc, wo, eval * sc->weight);
if (!_surface_shader_exclude(sc->type, light_shader_flags)) {
bsdf_eval_accum(result_eval, sc, wo, eval * sc->weight);
}
sum_pdf += bsdf_pdf * sc->sample_weight;
}
}
@@ -319,12 +321,14 @@ ccl_device_inline float surface_shader_bsdf_eval_pdfs(const KernelGlobals kg,
const ccl_private ShaderClosure *sc = &sd->closure[i];
if (CLOSURE_IS_BSDF_OR_BSSRDF(sc->type)) {
if (CLOSURE_IS_BSDF(sc->type) && !_surface_shader_exclude(sc->type, light_shader_flags)) {
if (CLOSURE_IS_BSDF(sc->type)) {
float bsdf_pdf = 0.0f;
const Spectrum eval = bsdf_eval(kg, sd, sc, wo, &bsdf_pdf);
kernel_assert(bsdf_pdf >= 0.0f);
if (bsdf_pdf != 0.0f) {
bsdf_eval_accum(result_eval, sc, wo, eval * sc->weight);
if (!_surface_shader_exclude(sc->type, light_shader_flags)) {
bsdf_eval_accum(result_eval, sc, wo, eval * sc->weight);
}
sum_pdf += bsdf_pdf * sc->sample_weight;
kernel_assert(bsdf_pdf * sc->sample_weight >= 0.0f);
pdfs[i] = bsdf_pdf * sc->sample_weight;