Commit: e267191393fe5dbde91d5b428f4a6adaf6a3fa8f
Author: L. E. Segovia
Date:   Wed Jun 13 12:12:07 2018 +0000
Branches: soc-2018-hair-shader
https://developer.blender.org/rBe267191393fe5dbde91d5b428f4a6adaf6a3fa8f

Fix a precision issue in the coord frame with low roughness

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

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 81ac68c4a9e..f8f76cc9007 100644
--- a/intern/cycles/kernel/closure/bsdf_hair_principled.h
+++ b/intern/cycles/kernel/closure/bsdf_hair_principled.h
@@ -172,7 +172,7 @@ ccl_device int bsdf_principled_hair_setup(ShaderData *sd, 
PrincipledHairBSDF *bs
        bsdf->m0_roughness = clamp(bsdf->m0_roughness*bsdf->v, 0.001f, 0.999f);
 
        /* Compute local frame, aligned to curve tangent and ray direction. */
-       float3 X = normalize(sd->dPdu);
+       float3 X = safe_normalize(sd->dPdu);
        float3 Y = safe_normalize(cross(X, sd->I));
        float3 Z = safe_normalize(cross(X, Y));
        
@@ -265,9 +265,9 @@ ccl_device float3 bsdf_principled_hair_eval(const 
ShaderData *sd, const ShaderCl
        const PrincipledHairBSDF *bsdf = (const PrincipledHairBSDF*) sc;
        float3 Y = float4_to_float3(bsdf->extra->geom);
 
-       float3 X = normalize(sd->dPdu);
+       float3 X = safe_normalize(sd->dPdu);
        kernel_assert(fabsf(dot(X, Y)) < 1e-4f);
-       float3 Z = normalize(cross(X, Y));
+       float3 Z = safe_normalize(cross(X, Y));
 
        float3 wo = make_float3(dot(sd->I, X), dot(sd->I, Y), dot(sd->I, Z));
        float3 wi = make_float3(dot(omega_in, X), dot(omega_in, Y), 
dot(omega_in, Z));
@@ -348,9 +348,9 @@ ccl_device int bsdf_principled_hair_sample(KernelGlobals 
*kg, const ShaderClosur
 
        float3 Y = float4_to_float3(bsdf->extra->geom);
 
-       float3 X = normalize(sd->dPdu);
+       float3 X = safe_normalize(sd->dPdu);
        kernel_assert(fabsf(dot(X, Y)) < 1e-4f);
-       float3 Z = normalize(cross(X, Y));
+       float3 Z = safe_normalize(cross(X, Y));
 
        float3 wo = make_float3(dot(sd->I, X), dot(sd->I, Y), dot(sd->I, Z));
        //kernel_assert(fabsf(wo.y) < 1e-4f);
@@ -458,7 +458,7 @@ ccl_device int bsdf_principled_hair_sample(KernelGlobals 
*kg, const ShaderClosur
        *omega_in = X*sin_theta_i + Y*cos_theta_i*cosf(phi_i) + 
Z*cos_theta_i*sinf(phi_i);
 
 #ifdef __RAY_DIFFERENTIALS__
-       float3 N = normalize(sd->I + *omega_in);
+       float3 N = safe_normalize(sd->I + *omega_in);
        *domega_in_dx = (2 * dot(N, sd->dI.dx)) * N - sd->dI.dx;
        *domega_in_dy = (2 * dot(N, sd->dI.dy)) * N - sd->dI.dy;
 #endif

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to