[Bf-blender-cvs] [b8c8e275862] temp-ssr: Eevee: SSR: Don't block the ray if tracing behind object.

Clément Foucault noreply at git.blender.org
Mon Jul 24 15:25:17 CEST 2017


Commit: b8c8e275862c65bbd3b3bf5c8f70bd69f28039a2
Author: Clément Foucault
Date:   Wed Jul 19 23:40:14 2017 +0200
Branches: temp-ssr
https://developer.blender.org/rBb8c8e275862c65bbd3b3bf5c8f70bd69f28039a2

Eevee: SSR: Don't block the ray if tracing behind object.

This requires to check for backface after a hit.

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

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

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

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 3c0b1952e7a..7337ec792c9 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -67,11 +67,14 @@ void main()
 	/* Raycast over screen */
 	float hit_dist = raycast(depthBuffer, viewPosition, R);
 
-	/* TODO Check if has hit a backface */
-
 	vec2 hit_co = project_point(ProjectionMatrix, viewPosition + R * hit_dist).xy * 0.5 + 0.5;
+
+	/* Check if has hit a backface */
+	vec3 hit_N = normal_decode(textureLod(normalBuffer, hit_co, 0.0).rg, V);
+	pdf *= step(0.0, dot(-R, hit_N));
+
 	hitData = hit_co.xyxy;
-	pdfData = vec4(pdf) * step(-0.1, hit_dist);
+	pdfData = vec4(pdf) * step(0.0, hit_dist);
 }
 
 #else /* STEP_RESOLVE */
diff --git a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
index d53c0a276e8..1e10311bf35 100644
--- a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl
@@ -111,7 +111,10 @@ float raycast(sampler2D depth_texture, vec3 ray_origin, vec3 ray_dir)
 		raw_depth = texelFetch(depth_texture, ivec2(hitpixel), 0).r;
 		view_depth = get_view_z_from_depth(raw_depth);
 
-		if (zmax < view_depth) {
+		/* TODO user threshold */
+		const float threshold = 0.5; /* In view space */
+		/* Check if we are somewhere near the surface. */
+		if ((zmax < view_depth) && (zmax > view_depth - threshold)) {
 			/* Below surface, cannot trace further */
 			hit = true;
 		}
@@ -137,20 +140,16 @@ float raycast(sampler2D depth_texture, vec3 ray_origin, vec3 ray_dir)
 			raw_depth = texelFetch(depth_texture, ivec2(hitpixel), 0).r;
 			view_depth = get_view_z_from_depth(raw_depth);
 
-			if (zmax < view_depth) {
+			/* TODO user threshold */
+			const float threshold = 0.5; /* In view space */
+			/* Check if we are somewhere near the surface. */
+			if ((zmax < view_depth) && (zmax > view_depth - threshold)) {
 				/* Below surface, cannot trace further */
 				break;
 			}
 		}
 	}
 
-	/* Check if we are somewhere near the surface. */
-	/* TODO user threshold */
-	float threshold = 0.1; /* In clip space */
-	if (zmax < view_depth - threshold) {
-		hit = false;
-	}
-
 	/* Check failure cases (out of screen, hit background) */
 	if (hit && (raw_depth != 1.0) && (raw_depth != 0.0)) {
 		/* Return length */




More information about the Bf-blender-cvs mailing list