[Bf-blender-cvs] [e50ed90e4df] master: Fix T53348: Cycles difference between gradient texture on CPU and GPU.

Brecht Van Lommel noreply at git.blender.org
Thu Nov 23 17:40:56 CET 2017


Commit: e50ed90e4dff3a01fd5e3211f3571a34e1d6855d
Author: Brecht Van Lommel
Date:   Thu Nov 23 16:10:38 2017 +0100
Branches: master
https://developer.blender.org/rBe50ed90e4dff3a01fd5e3211f3571a34e1d6855d

Fix T53348: Cycles difference between gradient texture on CPU and GPU.

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

M	intern/cycles/kernel/svm/svm_gradient.h
M	source/blender/gpu/shaders/gpu_shader_material.glsl

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

diff --git a/intern/cycles/kernel/svm/svm_gradient.h b/intern/cycles/kernel/svm/svm_gradient.h
index 53d7b4f812c..74e36e70427 100644
--- a/intern/cycles/kernel/svm/svm_gradient.h
+++ b/intern/cycles/kernel/svm/svm_gradient.h
@@ -46,7 +46,10 @@ ccl_device float svm_gradient(float3 p, NodeGradientType type)
 		return atan2f(y, x) / M_2PI_F + 0.5f;
 	}
 	else {
-		float r = fmaxf(1.0f - sqrtf(x*x + y*y + z*z), 0.0f);
+		/* Bias a little bit for the case where p is a unit length vector,
+		 * to get exactly zero instead of a small random value depending
+		 * on float precision. */
+		float r = fmaxf(0.999999f - sqrtf(x*x + y*y + z*z), 0.0f);
 
 		if(type == NODE_BLEND_QUADRATIC_SPHERE)
 			return r*r;
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 4ac69119a6c..0a63fc216a0 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -2971,7 +2971,10 @@ float calc_gradient(vec3 p, int gradient_type)
 		return atan(y, x) / (M_PI * 2) + 0.5;
 	}
 	else {
-		float r = max(1.0 - sqrt(x * x + y * y + z * z), 0.0);
+		/* Bias a little bit for the case where p is a unit length vector,
+		 * to get exactly zero instead of a small random value depending
+		 * on float precision. */
+		float r = max(0.999999 - sqrt(x * x + y * y + z * z), 0.0);
 		if (gradient_type == 5) {  /* quadratic sphere */
 			return r * r;
 		}



More information about the Bf-blender-cvs mailing list