From 3d73609832da4039ac0d4c4a3089ea180213fd1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 29 Jan 2020 00:32:45 +0100 Subject: 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. --- source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl | 1 + source/blender/draw/engines/eevee/shaders/ltc_lib.glsl | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'source/blender/draw/engines/eevee/shaders') 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); -- cgit v1.2.3