[Bf-blender-cvs] [e267191393f] soc-2018-hair-shader: Fix a precision issue in the coord frame with low roughness

L. E. Segovia noreply at git.blender.org
Wed Jun 13 14:12:35 CEST 2018


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



More information about the Bf-blender-cvs mailing list