From ca389c7b56a1ceeebf9475adf1580152e5c6e5fa Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Wed, 21 Feb 2024 23:02:39 +0100 Subject: [PATCH] Fix Principled Hair Huang wrong TIR condition `cos_theta_t` was not initialized for TIR case Thanks Christophe Hery for spotting the bug --- intern/cycles/kernel/closure/bsdf_principled_hair_huang.h | 6 ++---- intern/cycles/kernel/closure/bsdf_util.h | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h b/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h index c3b7c54da6f..99c870f95fa 100644 --- a/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h +++ b/intern/cycles/kernel/closure/bsdf_principled_hair_huang.h @@ -717,7 +717,7 @@ ccl_device int bsdf_hair_huang_sample(const KernelGlobals kg, wtt = refract_angle(-wt, wh2, cos_theta_t2, bsdf->eta); - if (dot(wmt, -wtt) > 0.0f && cos_theta_t2 != 0.0f && microfacet_visible(-wtt, wmt_, wh2)) { + if (dot(wmt, -wtt) > 0.0f && T2 > 0.0f && microfacet_visible(-wtt, wmt_, wh2)) { TT = bsdf->extra->TT * T1 * A_t * T2 * scale2 * bsdf_Go(roughness2, cos_mi2, dot(wmt, -wtt)); } @@ -746,9 +746,7 @@ ccl_device int bsdf_hair_huang_sample(const KernelGlobals kg, const float T3 = 1.0f - R3; - if (cos_theta_t3 != 0.0f && - microfacet_visible(wtr, -wtrt, make_float3(wmtr.x, 0.0f, wmtr.z), wh3)) - { + if (T3 > 0.0f && microfacet_visible(wtr, -wtrt, make_float3(wmtr.x, 0.0f, wmtr.z), wh3)) { TRT = bsdf->extra->TRT * TR * make_spectrum(T3) * bsdf_Go(roughness2, cos_mi3, dot(wmtr, -wtrt)); } diff --git a/intern/cycles/kernel/closure/bsdf_util.h b/intern/cycles/kernel/closure/bsdf_util.h index 60a958028f2..8ec374bfb9a 100644 --- a/intern/cycles/kernel/closure/bsdf_util.h +++ b/intern/cycles/kernel/closure/bsdf_util.h @@ -20,6 +20,7 @@ ccl_device float fresnel_dielectric(float cos_theta_i, float eta, ccl_private fl const float eta_cos_theta_t_sq = sqr(eta) - (1.0f - sqr(cos_theta_i)); if (eta_cos_theta_t_sq <= 0) { /* Total internal reflection. */ + *r_cos_theta_t = 0.0f; return 1.0f; }