[Bf-blender-cvs] [3d73609832d] blender-v2.82-release: Fix T67060 EEVEE: Noise caused by disk lights

Clément Foucault noreply at git.blender.org
Wed Jan 29 01:02:21 CET 2020


Commit: 3d73609832da4039ac0d4c4a3089ea180213fd1b
Author: Clément Foucault
Date:   Wed Jan 29 00:32:45 2020 +0100
Branches: blender-v2.82-release
https://developer.blender.org/rB3d73609832da4039ac0d4c4a3089ea180213fd1b

Fix T67060 EEVEE: Noise caused by disk lights

This is an issue on some drivers that might output NaN out of sqrt if the
number is infinity.

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

M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/draw/engines/eevee/shaders/ltc_lib.glsl

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

diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index 359e6fe4cc2..c4f815b5dd4 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -5,6 +5,7 @@
 #define M_1_PI 0.318309886183790671538  /* 1/pi */
 #define M_1_2PI 0.159154943091895335768 /* 1/(2*pi) */
 #define M_1_PI2 0.101321183642337771443 /* 1/(pi^2) */
+#define FLT_MAX 3.402823e+38
 
 #define LUT_SIZE 64
 
diff --git a/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl b/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl
index 2cf8501de9b..61d34e2afdc 100644
--- a/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl
@@ -54,6 +54,9 @@ vec3 solve_cubic(vec4 coefs)
   /* Discriminant */
   float discr = dot(vec2(4.0 * delta.x, -delta.y), delta.zy);
 
+  /* Clamping avoid NaN output on some platform. (see T67060) */
+  float sqrt_discr = sqrt(clamp(discr, 0.0, FLT_MAX));
+
   vec2 xlc, xsc;
 
   /* Algorithm A */
@@ -63,7 +66,7 @@ vec3 solve_cubic(vec4 coefs)
     float D_a = -2.0 * B * delta.x + delta.y;
 
     /* Take the cubic root of a normalized complex number */
-    float theta = atan(sqrt(discr), -D_a) / 3.0;
+    float theta = atan(sqrt_discr, -D_a) / 3.0;
 
     float x_1a = 2.0 * sqrt(-C_a) * cos(theta);
     float x_3a = 2.0 * sqrt(-C_a) * cos(theta + (2.0 / 3.0) * M_PI);
@@ -86,7 +89,7 @@ vec3 solve_cubic(vec4 coefs)
     float D_d = -D * delta.y + 2.0 * C * delta.z;
 
     /* Take the cubic root of a normalized complex number */
-    float theta = atan(D * sqrt(discr), -D_d) / 3.0;
+    float theta = atan(D * sqrt_discr, -D_d) / 3.0;
 
     float x_1d = 2.0 * sqrt(-C_d) * cos(theta);
     float x_3d = 2.0 * sqrt(-C_d) * cos(theta + (2.0 / 3.0) * M_PI);



More information about the Bf-blender-cvs mailing list