diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-01-23 17:05:16 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-01-23 17:41:41 +0300 |
commit | 3cd32c376db32d4072c34b5b6a04943876d8db38 (patch) | |
tree | 78783469dc1d7dfc4fb17fe0a3127bc4169c44e2 /source | |
parent | 6dcbc3cd5aa468f346260fc89ffd58c9445391b7 (diff) |
Fix T66956 EEVEE: NaN produced by bad geometry mess with the DoF
Sanitize the source of the depth of field.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl index ca4940ceffb..5277bfa32bb 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_dof_frag.glsl @@ -41,6 +41,12 @@ float max_v4(vec4 v) return max(max(v.x, v.y), max(v.z, v.w)); } +vec4 safe_color(vec4 c) +{ + /* Clamp to avoid black square artifacts if a pixel goes NaN. */ + return clamp(c, vec4(0.0), vec4(1e20)); /* 1e20 arbitrary. */ +} + #define THRESHOLD 1.0 #ifdef STEP_DOWNSAMPLE @@ -57,10 +63,10 @@ void main(void) ivec4 uvs = ivec4(gl_FragCoord.xyxy) * 2 + ivec4(0, 0, 1, 1); /* custom downsampling */ - vec4 color1 = texelFetch(colorBuffer, uvs.xy, 0); - vec4 color2 = texelFetch(colorBuffer, uvs.zw, 0); - vec4 color3 = texelFetch(colorBuffer, uvs.zy, 0); - vec4 color4 = texelFetch(colorBuffer, uvs.xw, 0); + vec4 color1 = safe_color(texelFetch(colorBuffer, uvs.xy, 0)); + vec4 color2 = safe_color(texelFetch(colorBuffer, uvs.zw, 0)); + vec4 color3 = safe_color(texelFetch(colorBuffer, uvs.zy, 0)); + vec4 color4 = safe_color(texelFetch(colorBuffer, uvs.xw, 0)); /* Leverage SIMD by combining 4 depth samples into a vec4 */ vec4 depth; |