[Bf-blender-cvs] [0665f58a57b] blender2.8: Eevee: Fix NaN

Clément Foucault noreply at git.blender.org
Fri Aug 11 01:31:44 CEST 2017


Commit: 0665f58a57b54c874f9d944cb0fbf3422cb214b0
Author: Clément Foucault
Date:   Thu Aug 10 23:08:33 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB0665f58a57b54c874f9d944cb0fbf3422cb214b0

Eevee: Fix NaN

This was surely cause by float overflow. Limit roughness in this case to limit the brdf intensity.
Also compute VH faster.

Add a sanitizer to the SSR pass for investigating where NANs come from. Play with the roughness until you see where the black pixel is / comes from.

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

M	source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
M	source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl

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

diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
index 352cd60de3c..d0a365f5a3e 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl
@@ -85,6 +85,7 @@ float direct_diffuse_unit_disc(vec3 N, vec3 L)
 /* ----------- GGx ------------ */
 vec3 direct_ggx_point(vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0)
 {
+	roughness = max(1e-3, roughness);
 	float dist = l_vector.w;
 	vec3 L = l_vector.xyz / dist;
 	float bsdf = bsdf_ggx(N, L, V, roughness);
@@ -97,8 +98,9 @@ vec3 direct_ggx_point(vec3 N, vec3 V, vec4 l_vector, float roughness, vec3 f0)
 
 vec3 direct_ggx_sun(LightData ld, vec3 N, vec3 V, float roughness, vec3 f0)
 {
+	roughness = max(1e-3, roughness);
 	float bsdf = bsdf_ggx(N, -ld.l_forward, V, roughness);
-	float VH = max(dot(V, normalize(V - ld.l_forward)), 0.0);
+	float VH = dot(V, -ld.l_forward) * 0.5 + 0.5;
 	return F_schlick(f0, VH) * bsdf;
 }
 
diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
index 68bcf8c06e4..267c52f0508 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -270,7 +270,7 @@ vec4 get_ssr_sample(
 	mask = min(mask, screen_border_mask(ref_uvs));
 	mask *= float(has_hit);
 
-	float hit_dist = length(hit_vec);
+	float hit_dist = max(1e-8, length(hit_vec));
 	vec3 L = hit_vec / hit_dist;
 
 	float cone_footprint = hit_dist * cone_tan;
@@ -306,6 +306,10 @@ vec4 get_ssr_sample(
 	/* Do not add light if ray has failed. */
 	sample *= float(has_hit);
 
+#if 0 /* Enable to see where NANs come from. */
+	sample = (any(isnan(sample))) ? vec3(0.0) : sample;
+#endif
+
 	return vec4(sample, mask) * weight;
 }




More information about the Bf-blender-cvs mailing list