Commit: f53fa8d148f8f5059d28ca691f72c0ca11497b8a
Author: Clément Foucault
Date:   Wed Aug 9 15:43:21 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBf53fa8d148f8f5059d28ca691f72c0ca11497b8a

Eevee: SSR: Fix cone footprint estimation.

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

M       source/blender/draw/engines/eevee/shaders/effect_ssr_frag.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 b1286fd15f0..68bcf8c06e4 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -7,6 +7,7 @@
 uniform sampler2DArray utilTex;
 #endif /* UTIL_TEX */
 
+#define BRDF_BIAS 0.7
 #define MAX_MIP 9.0
 
 #ifdef STEP_RAYTRACE
@@ -251,38 +252,35 @@ vec4 get_ssr_sample(
        vec3 hit_pos = transform_point(ViewMatrixInverse, hit_co_pdf.xyz);
 
        vec2 ref_uvs;
-       vec3 L;
+       vec3 hit_vec;
        float mask = 1.0;
-       float cone_footprint;
        if (is_planar) {
                /* Reflect back the hit position to have it in non-reflected 
world space */
                vec3 trace_pos = line_plane_intersect(worldPosition, V, 
pd.pl_plane_eq);
-               vec3 hit_vec = hit_pos - trace_pos;
+               hit_vec = hit_pos - trace_pos;
                hit_vec = reflect(hit_vec, pd.pl_normal);
-               hit_pos = hit_vec + trace_pos;
-               L = normalize(hit_vec);
                ref_uvs = project_point(ProjectionMatrix, hit_co_pdf.xyz).xy * 
0.5 + 0.5;
-               vec2 uvs = gl_FragCoord.xy / texture_size;
-
-               /* Compute cone footprint in screen space. */
-               float homcoord = ProjectionMatrix[2][3] * hit_co_pdf.z + 
ProjectionMatrix[3][3];
-               cone_footprint = length(hit_vec) * cone_tan * 
ProjectionMatrix[0][0] / homcoord;
        }
        else {
                /* Find hit position in previous frame. */
                ref_uvs = get_reprojected_reflection(hit_pos, worldPosition, N);
-               L = normalize(hit_pos - worldPosition);
-               vec2 uvs = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0));
-               mask *= screen_border_mask(uvs);
-
-               /* Compute cone footprint Using UV distance because we are 
using screen space filtering. */
-               cone_footprint = cone_tan * distance(ref_uvs, source_uvs);
+               hit_vec = hit_pos - worldPosition;
+               mask = screen_border_mask(gl_FragCoord.xy / texture_size);
        }
        mask = min(mask, screen_border_mask(ref_uvs));
        mask *= float(has_hit);
 
+       float hit_dist = length(hit_vec);
+       vec3 L = hit_vec / hit_dist;
+
+       float cone_footprint = hit_dist * cone_tan;
+
+       /* Compute cone footprint in screen space. */
+       float homcoord = ProjectionMatrix[2][3] * hit_co_pdf.z + 
ProjectionMatrix[3][3];
+       cone_footprint = BRDF_BIAS * 0.5 * cone_footprint * 
max(ProjectionMatrix[0][0], ProjectionMatrix[1][1]) / homcoord;
+
        /* Estimate a cone footprint to sample a corresponding mipmap level. */
-       float mip = BRDF_BIAS * clamp(log2(cone_footprint * max(texture_size.x, 
texture_size.y)), 0.0, MAX_MIP) - 1.0;
+       float mip = clamp(log2(cone_footprint * max(texture_size.x, 
texture_size.y)), 0.0, MAX_MIP);
 
        /* Correct UVs for mipmaping mis-alignment */
        float low_mip = floor(mip);
@@ -365,7 +363,7 @@ void main()
        /* Resolve SSR */
        float cone_cos = cone_cosine(roughnessSquared);
        float cone_tan = sqrt(1 - cone_cos * cone_cos) / cone_cos;
-       cone_tan *= mix(saturate(dot(N, V) * 2.0), 1.0, roughness); /* 
Elongation fit */
+       cone_tan *= mix(saturate(dot(N, -V) * 2.0), 1.0, roughness); /* 
Elongation fit */
 
        vec2 source_uvs = project_point(PastViewProjectionMatrix, 
worldPosition).xy * 0.5 + 0.5;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to