diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-01-16 15:18:04 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-01-16 20:22:24 +0300 |
commit | 9365e966b415c9a9f6aab180eac25982341519a3 (patch) | |
tree | 95ee35fab4abddd1bbfa96dd18d1d4fed0c5b517 /source/blender | |
parent | 2221cdb5179467e5b654a41b4c24796bcd66cb93 (diff) |
Eevee: SSR: Enhance the halfres raytrace.
This make the halfres raytrace actually converge to an antialiased image by jittering the source pixel.
Diffstat (limited to 'source/blender')
3 files changed, 25 insertions, 5 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 5fb25229902..e0468687c6e 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -498,6 +498,7 @@ typedef struct EEVEE_EffectsInfo { bool reflection_trace_full; bool ssr_use_normalization; int ssr_neighbor_ofs; + int ssr_halfres_ofs[2]; float ssr_firefly_fac; float ssr_border_fac; float ssr_max_roughness; diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c index 568b34db088..d704668ea79 100644 --- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c +++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c @@ -223,6 +223,9 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v DRW_shgroup_uniform_float(grp, "maxRoughness", &effects->ssr_max_roughness, 1); DRW_shgroup_uniform_buffer(grp, "planarDepth", &vedata->txl->planar_depth); DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); + if (!effects->reflection_trace_full) { + DRW_shgroup_uniform_ivec2(grp, "halfresOffset", effects->ssr_halfres_ofs, 1); + } DRW_shgroup_call_add(grp, quad, NULL); psl->ssr_resolve = DRW_pass_create("SSR Resolve", DRW_STATE_WRITE_COLOR | DRW_STATE_ADDITIVE); @@ -310,6 +313,24 @@ void EEVEE_reflection_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v /* Doing a neighbor shift only after a few iteration. We wait for a prime number of cycles to avoid * noise correlation. This reduces variance faster. */ effects->ssr_neighbor_ofs = ((sample / 5) % 8) * 4; + switch ((sample / 11) % 4) { + case 0: + effects->ssr_halfres_ofs[0] = 0; + effects->ssr_halfres_ofs[1] = 0; + break; + case 1: + effects->ssr_halfres_ofs[0] = 0; + effects->ssr_halfres_ofs[1] = 1; + break; + case 2: + effects->ssr_halfres_ofs[0] = 1; + effects->ssr_halfres_ofs[1] = 0; + break; + case 4: + effects->ssr_halfres_ofs[0] = 1; + effects->ssr_halfres_ofs[1] = 1; + break; + } DRW_framebuffer_texture_detach(dtxl->depth); DRW_framebuffer_texture_detach(txl->ssr_normal_input); DRW_framebuffer_texture_detach(txl->ssr_specrough_input); 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 6c770fa029f..d615baba161 100644 --- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl @@ -12,6 +12,7 @@ uniform sampler2DArray utilTex; uniform float fireflyFactor; uniform float maxRoughness; +uniform ivec2 halfresOffset; ivec2 encode_hit_data(vec2 hit_pos, bool has_hit, bool is_planar) { @@ -97,7 +98,7 @@ void main() ivec2 fullres_texel = ivec2(gl_FragCoord.xy); ivec2 halfres_texel = fullres_texel; #else - ivec2 fullres_texel = ivec2(gl_FragCoord.xy) * 2; + ivec2 fullres_texel = ivec2(gl_FragCoord.xy) * 2 + halfresOffset; ivec2 halfres_texel = ivec2(gl_FragCoord.xy); #endif @@ -107,10 +108,7 @@ void main() if (depth == 1.0) discard; - vec2 uvs = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0)); -#ifndef FULLRES - uvs *= 2.0; -#endif + vec2 uvs = vec2(fullres_texel) / vec2(textureSize(depthBuffer, 0)); /* Using view space */ vec3 viewPosition = get_view_space_from_depth(uvs, depth); |