Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-01-29 02:32:45 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-01-29 03:02:14 +0300
commit3d73609832da4039ac0d4c4a3089ea180213fd1b (patch)
treec1aef873a005d4865f601895a84714acab98725a /source/blender/draw/engines/eevee/shaders/ltc_lib.glsl
parentf9e1e088a4c7000158aa1e99d32a7785bc36e9e5 (diff)
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.
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/ltc_lib.glsl')
-rw-r--r--source/blender/draw/engines/eevee/shaders/ltc_lib.glsl7
1 files changed, 5 insertions, 2 deletions
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);