[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