From 063a9e8964e152ea2dd104a6c9eac4a623ca1d6e Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Fri, 8 Sep 2023 18:19:22 +0200 Subject: [PATCH] Fix: Cycles: inconsistent normal checks when sampling and evaluating BSDF was mixing real geometry normal, smoothed geometry normal and bump-mapped normal. Use `(sd->type & PRIMITIVE_CURVE) ? sc->N : sd->Ng` consistently instead. --- intern/cycles/kernel/closure/bsdf.h | 7 ++++--- intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/intern/cycles/kernel/closure/bsdf.h b/intern/cycles/kernel/closure/bsdf.h index 455624db919..273039013c1 100644 --- a/intern/cycles/kernel/closure/bsdf.h +++ b/intern/cycles/kernel/closure/bsdf.h @@ -459,6 +459,7 @@ ccl_device_inline { Spectrum eval = zero_spectrum(); *pdf = 0.f; + const float3 Ng = (sd->type & PRIMITIVE_CURVE) ? sc->N : sd->Ng; switch (sc->type) { case CLOSURE_BSDF_DIFFUSE_ID: @@ -486,15 +487,15 @@ ccl_device_inline case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID: case CLOSURE_BSDF_MICROFACET_GGX_REFRACTION_ID: case CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID: - eval = bsdf_microfacet_ggx_eval(sc, sd->N, sd->wi, wo, pdf); + eval = bsdf_microfacet_ggx_eval(sc, Ng, sd->wi, wo, pdf); break; case CLOSURE_BSDF_MICROFACET_BECKMANN_ID: case CLOSURE_BSDF_MICROFACET_BECKMANN_REFRACTION_ID: case CLOSURE_BSDF_MICROFACET_BECKMANN_GLASS_ID: - eval = bsdf_microfacet_beckmann_eval(sc, sd->N, sd->wi, wo, pdf); + eval = bsdf_microfacet_beckmann_eval(sc, Ng, sd->wi, wo, pdf); break; case CLOSURE_BSDF_ASHIKHMIN_SHIRLEY_ID: - eval = bsdf_ashikhmin_shirley_eval(sc, sd->N, sd->wi, wo, pdf); + eval = bsdf_ashikhmin_shirley_eval(sc, Ng, sd->wi, wo, pdf); break; case CLOSURE_BSDF_ASHIKHMIN_VELVET_ID: eval = bsdf_ashikhmin_velvet_eval(sc, sd->wi, wo, pdf); diff --git a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h index 8367c356e06..b47558d86fb 100644 --- a/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h +++ b/intern/cycles/kernel/closure/bsdf_ashikhmin_shirley.h @@ -207,7 +207,7 @@ ccl_device int bsdf_ashikhmin_shirley_sample(ccl_private const ShaderClosure *sc } else { /* leave the rest to eval */ - *eval = bsdf_ashikhmin_shirley_eval(sc, N, wi, *wo, pdf); + *eval = bsdf_ashikhmin_shirley_eval(sc, Ng, wi, *wo, pdf); } return label;