diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-05-01 18:27:51 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-05-01 18:59:40 +0300 |
commit | 8c92a027206f781ee929d7b8906a175abf4ed674 (patch) | |
tree | 4dd41d0f27d83a82c26a4bd1f093d6583365bf0d /source/blender | |
parent | 92fd931e536faa8eae250c302d6c4846fe5e1916 (diff) |
Eevee: Fix raytracing.
- Fix the confusing naming in raycast()
- Fix raytrace acne caused by the rays not being correctly centered on
the texel.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl index cb75731b7da..aa1dda6b3b5 100644 --- a/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/raytrace_lib.glsl @@ -9,7 +9,10 @@ float sample_depth(vec2 uv, int index, float lod) else { #endif /* Correct UVs for mipmaping mis-alignment */ - uv *= mipRatio[int(lod + 1.0)]; + /* + 1.0 because we are using half res maxzBuffer + * and mipRatio starts at on mip 0. */ + int mip = int(lod + 1.0); + uv *= mipRatio[mip]; return textureLod(maxzBuffer, uv, lod).r; #ifdef PLANAR_PROBE_RAYTRACE } @@ -58,13 +61,13 @@ float refine_isect(float prev_delta, float curr_delta) return saturate(prev_delta / (prev_delta - curr_delta)); } -void prepare_raycast(vec3 ray_origin, vec3 ray_end, float thickness, out vec4 ss_step, out vec4 ss_ray, out float max_time) +void prepare_raycast(vec3 ray_origin, vec3 ray_dir, float thickness, out vec4 ss_step, out vec4 ss_ray, out float max_time) { /* Negate the ray direction if it goes towards the camera. * This way we don't need to care if the projected point * is behind the near plane. */ - float z_sign = -sign(ray_end.z); - ray_end = z_sign * ray_end + ray_origin; + float z_sign = -sign(ray_dir.z); + vec3 ray_end = ray_origin + z_sign * ray_dir; /* Project into screen space. */ vec4 ss_start, ss_end; @@ -94,7 +97,7 @@ void prepare_raycast(vec3 ray_origin, vec3 ray_end, float thickness, out vec4 ss /* Make ss_step cover one pixel. */ ss_step /= max(abs(ss_step.x), abs(ss_step.y)); - ss_step *= ((abs(ss_step.x) > abs(ss_step.y)) ? ssrPixelSize.x : ssrPixelSize.y); + ss_step *= (abs(ss_step.x) > abs(ss_step.y)) ? ssrPixelSize.x : ssrPixelSize.y; /* Clip to segment's end. */ max_time /= length(ss_step.xyz); @@ -107,6 +110,8 @@ void prepare_raycast(vec3 ray_origin, vec3 ray_end, float thickness, out vec4 ss * 4th component how far we are on the ray */ ss_ray = ss_start * 0.5 + 0.5; ss_step *= 0.5; + + ss_ray.xy += 0.5 * ssrPixelSize * 2.0; /* take the center of the texel. * 2 because halfres. */ } /* See times_and_deltas. */ @@ -117,14 +122,14 @@ void prepare_raycast(vec3 ray_origin, vec3 ray_end, float thickness, out vec4 ss // #define GROUPED_FETCHES /* is still slower, need to see where is the bottleneck. */ /* Return the hit position, and negate the z component (making it positive) if not hit occured. */ -/* __ray_end__ is the ray direction premultiplied by it's maximum length */ +/* __ray_dir__ is the ray direction premultiplied by it's maximum length */ vec3 raycast( - int index, vec3 ray_origin, vec3 ray_end, float thickness, float ray_jitter, + int index, vec3 ray_origin, vec3 ray_dir, float thickness, float ray_jitter, float trace_quality, float roughness, const bool discard_backface) { vec4 ss_step, ss_start; float max_time; - prepare_raycast(ray_origin, ray_end, thickness, ss_step, ss_start, max_time); + prepare_raycast(ray_origin, ray_dir, thickness, ss_step, ss_start, max_time); float max_trace_time = max(0.001, max_time - 0.01); |