[Bf-blender-cvs] [21aefa098f4] soc-2018-hair-shader-fixes: Mode weights must not affect the BSDF's PDF

L. E. Segovia noreply at git.blender.org
Wed Jul 25 21:06:02 CEST 2018


Commit: 21aefa098f4935597a759e199153e9b55279ff8a
Author: L. E. Segovia
Date:   Wed Jul 25 19:05:45 2018 +0000
Branches: soc-2018-hair-shader-fixes
https://developer.blender.org/rB21aefa098f4935597a759e199153e9b55279ff8a

Mode weights must not affect the BSDF's PDF

===================================================================

M	intern/cycles/kernel/closure/bsdf_hair_principled.h

===================================================================

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);



More information about the Bf-blender-cvs mailing list