From 403bb357ae2b1d2561a0d77c96035ba54c197cbd Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 24 Feb 2020 10:46:45 +0100 Subject: Fix T74110: EEVEE Shadow Pass Shadow could penetrate occluded geometry. This patch adds a check to see if the light is in the right location to light the pixel. Reviewed By: fclem Differential Revision: https://developer.blender.org/D6918 --- source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl | 6 ++++-- source/blender/draw/intern/shaders/common_view_lib.glsl | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl index fa02bee45b7..fe6a828f369 100644 --- a/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/shadow_accum_frag.glsl @@ -19,7 +19,7 @@ void main() float depth = texelFetch(depthBuffer, texel, 0).r; if (depth == 1.0f) { /* Early exit background does not receive shadows */ - fragColor.r = 1.0; + fragColor.r = 0.0; return; } @@ -40,6 +40,7 @@ void main() vec3 worldPosition = transform_point(ViewMatrixInverse, viewPosition); vec3 true_normal = normalize(cross(dFdx(viewPosition), dFdy(viewPosition))); + vec3 N = normal_view_to_world(true_normal); for (int i = 0; i < MAX_LIGHT && i < laNumLight; i++) { LightData ld = lights_data[i]; @@ -48,8 +49,9 @@ void main() l_vector.xyz = ld.l_position - worldPosition; l_vector.w = length(l_vector.xyz); + float light_input = smoothstep(0.2, -0.2, -dot(N, normalize(l_vector.xyz))); float l_vis = light_shadowing( - ld, worldPosition, viewPosition, tracing_depth, true_normal, rand.x, true, 1.0); + ld, worldPosition, viewPosition, tracing_depth, true_normal, rand.x, true, light_input); accum_light += l_vis; } diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 6605e1165d4..cfe79cb3ee0 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -164,6 +164,7 @@ uniform mat4 ModelMatrixInverse; #define normal_object_to_world(n) (transpose(mat3(ModelMatrixInverse)) * n) #define normal_world_to_object(n) (transpose(mat3(ModelMatrix)) * n) #define normal_world_to_view(n) (mat3(ViewMatrix) * n) +#define normal_view_to_world(n) (mat3(ViewMatrixInverse) * n) #define point_object_to_ndc(p) (ViewProjectionMatrix * vec4((ModelMatrix * vec4(p, 1.0)).xyz, 1.0)) #define point_object_to_view(p) ((ViewMatrix * vec4((ModelMatrix * vec4(p, 1.0)).xyz, 1.0)).xyz) -- cgit v1.2.3