From 21aefa098f4935597a759e199153e9b55279ff8a Mon Sep 17 00:00:00 2001 From: "L. E. Segovia" Date: Wed, 25 Jul 2018 19:05:45 +0000 Subject: Mode weights must not affect the BSDF's PDF --- .../cycles/kernel/closure/bsdf_hair_principled.h | 26 +++++++++++++++------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/intern/cycles/kernel/closure/bsdf_hair_principled.h b/intern/cycles/kernel/closure/bsdf_hair_principled.h index 83c4a0eb69a..04b279230a1 100644 --- a/intern/cycles/kernel/closure/bsdf_hair_principled.h +++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h @@ -345,29 +345,34 @@ ccl_device float3 bsdf_principled_hair_eval(KernelGlobals *kg, float4 F; float Mp, Np; + float4 weight; /* Primary specular (R). */ Mp = longitudinal_scattering(angles[0], angles[1], sin_theta_o, cos_theta_o, bsdf->m0_roughness); Np = azimuthal_scattering(phi, 0, bsdf->s, gamma_o, gamma_t); - F = bsdf->extra->r * Ap[0] * Mp * Np; + weight = make_float4(bsdf->extra->r, bsdf->extra->r, bsdf->extra->r, 1.0f); + F = weight * Ap[0] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); /* Transmission (TT). */ Mp = longitudinal_scattering(angles[2], angles[3], sin_theta_o, cos_theta_o, 0.25f*bsdf->v); Np = azimuthal_scattering(phi, 1, bsdf->s, gamma_o, gamma_t); - F += bsdf->extra->tt * Ap[1] * Mp * Np; + weight = make_float4(bsdf->extra->tt, bsdf->extra->tt, bsdf->extra->tt, 1.0f); + F += weight * Ap[1] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); /* Secondary specular (TRT). */ Mp = longitudinal_scattering(angles[4], angles[5], sin_theta_o, cos_theta_o, 4.0f*bsdf->v); Np = azimuthal_scattering(phi, 2, bsdf->s, gamma_o, gamma_t); - F += bsdf->extra->trt * Ap[2] * Mp * Np; + weight = make_float4(bsdf->extra->trt, bsdf->extra->trt, bsdf->extra->trt, 1.0f); + F += weight * Ap[2] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); /* Residual component (TRRT+). */ Mp = longitudinal_scattering(sin_theta_i, cos_theta_i, sin_theta_o, cos_theta_o, 4.0f*bsdf->v); Np = M_1_2PI_F; - F += bsdf->extra->trrt * Ap[3] * Mp * Np; + weight = make_float4(bsdf->extra->trrt, bsdf->extra->trrt, bsdf->extra->trrt, 1.0f); + F += weight * Ap[3] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); *pdf = F.w; @@ -461,29 +466,34 @@ ccl_device int bsdf_principled_hair_sample(KernelGlobals *kg, float4 F; float Mp, Np; + float4 weight; /* Primary specular (R). */ Mp = longitudinal_scattering(angles[0], angles[1], sin_theta_o, cos_theta_o, bsdf->m0_roughness); Np = azimuthal_scattering(phi, 0, bsdf->s, gamma_o, gamma_t); - F = bsdf->extra->r * Ap[0] * Mp * Np; + weight = make_float4(bsdf->extra->r, bsdf->extra->r, bsdf->extra->r, 1.0f); + F = weight * Ap[0] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); /* Transmission (TT). */ Mp = longitudinal_scattering(angles[2], angles[3], sin_theta_o, cos_theta_o, 0.25f*bsdf->v); Np = azimuthal_scattering(phi, 1, bsdf->s, gamma_o, gamma_t); - F += bsdf->extra->tt * Ap[1] * Mp * Np; + weight = make_float4(bsdf->extra->tt, bsdf->extra->tt, bsdf->extra->tt, 1.0f); + F += weight * Ap[1] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); /* Secondary specular (TRT). */ Mp = longitudinal_scattering(angles[4], angles[5], sin_theta_o, cos_theta_o, 4.0f*bsdf->v); Np = azimuthal_scattering(phi, 2, bsdf->s, gamma_o, gamma_t); - F += bsdf->extra->trt * Ap[2] * Mp * Np; + weight = make_float4(bsdf->extra->trt, bsdf->extra->trt, bsdf->extra->trt, 1.0f); + F += weight * Ap[2] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); /* Residual component (TRRT+). */ Mp = longitudinal_scattering(sin_theta_i, cos_theta_i, sin_theta_o, cos_theta_o, 4.0f*bsdf->v); Np = M_1_2PI_F; - F += bsdf->extra->trrt * Ap[3] * Mp * Np; + weight = make_float4(bsdf->extra->trrt, bsdf->extra->trrt, bsdf->extra->trrt, 1.0f); + F += weight * Ap[3] * Mp * Np; kernel_assert(isfinite3_safe(float4_to_float3(F))); *eval = float4_to_float3(F); -- cgit v1.2.3