From 6b551c0b8cb0a3de5fe9ae5e9f9ee3181cd931fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 9 Sep 2018 23:24:06 +0200 Subject: Eevee: Depth of Feild: Fix ringing issue of background objects There was an issue caused by Antialiasing being done after DoF. Move TAA after DOF and Motion Blur. Also certain pixel with lower CoC would be spread all over the background because the neighbooring pixel have higher CoC. So we need to apply some bilateral filtering when downsampling. Currently we limit the influence of neighbor pixels with a CoC inside the range [MaxCoC-2, MaxCoC]. --- source/blender/draw/engines/eevee/eevee_effects.c | 70 +++++++++++------------ 1 file changed, 33 insertions(+), 37 deletions(-) (limited to 'source/blender/draw/engines/eevee/eevee_effects.c') diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 28658d5126c..f25a6cf68e8 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -119,6 +119,25 @@ static void eevee_create_shader_downsample(void) "#define COPY_DEPTH\n"); } +#define SETUP_BUFFER(tex, fb, fb_color) { \ + DRW_texture_ensure_fullscreen_2D(&tex, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP); \ + GPU_framebuffer_ensure_config(&fb, { \ + GPU_ATTACHMENT_TEXTURE(dtxl->depth), \ + GPU_ATTACHMENT_TEXTURE(tex), \ + }); \ + GPU_framebuffer_ensure_config(&fb_color, { \ + GPU_ATTACHMENT_NONE, \ + GPU_ATTACHMENT_TEXTURE(tex), \ + }); \ +} + +#define CLEANUP_BUFFER(tex, fb, fb_color) { \ + /* Cleanup to release memory */ \ + DRW_TEXTURE_FREE_SAFE(tex); \ + GPU_FRAMEBUFFER_FREE_SAFE(fb); \ + GPU_FRAMEBUFFER_FREE_SAFE(fb_color); \ +} + void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object *camera) { EEVEE_CommonUniformBuffer *common_data = &sldata->common_data; @@ -166,22 +185,10 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object * Ping Pong buffer */ if ((effects->enabled_effects & EFFECT_POST_BUFFER) != 0) { - DRW_texture_ensure_fullscreen_2D(&txl->color_post, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP); - - GPU_framebuffer_ensure_config(&fbl->effect_fb, { - GPU_ATTACHMENT_TEXTURE(dtxl->depth), - GPU_ATTACHMENT_TEXTURE(txl->color_post), - }); - - GPU_framebuffer_ensure_config(&fbl->effect_color_fb, { - GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE(txl->color_post), - }); + SETUP_BUFFER(txl->color_post, fbl->effect_fb, fbl->effect_color_fb); } else { - /* Cleanup to release memory */ - DRW_TEXTURE_FREE_SAFE(txl->color_post); - GPU_FRAMEBUFFER_FREE_SAFE(fbl->effect_fb); + CLEANUP_BUFFER(txl->color_post, fbl->effect_fb, fbl->effect_color_fb); } /** @@ -269,22 +276,17 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object * Setup double buffer so we can access last frame as it was before post processes. */ if ((effects->enabled_effects & EFFECT_DOUBLE_BUFFER) != 0) { - DRW_texture_ensure_fullscreen_2D(&txl->color_double_buffer, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP); - - GPU_framebuffer_ensure_config(&fbl->double_buffer_fb, { - GPU_ATTACHMENT_TEXTURE(dtxl->depth), - GPU_ATTACHMENT_TEXTURE(txl->color_double_buffer) - }); + SETUP_BUFFER(txl->color_double_buffer, fbl->double_buffer_fb, fbl->double_buffer_color_fb); + } + else { + CLEANUP_BUFFER(txl->color_double_buffer, fbl->double_buffer_fb, fbl->double_buffer_color_fb); + } - GPU_framebuffer_ensure_config(&fbl->double_buffer_color_fb, { - GPU_ATTACHMENT_NONE, - GPU_ATTACHMENT_TEXTURE(txl->color_double_buffer) - }); + if ((effects->enabled_effects & (EFFECT_TAA | EFFECT_TAA_REPROJECT)) != 0) { + SETUP_BUFFER(txl->taa_history, fbl->taa_history_fb, fbl->taa_history_color_fb); } else { - /* Cleanup to release memory */ - DRW_TEXTURE_FREE_SAFE(txl->color_double_buffer); - GPU_FRAMEBUFFER_FREE_SAFE(fbl->double_buffer_fb); + CLEANUP_BUFFER(txl->taa_history, fbl->taa_history_fb, fbl->taa_history_color_fb); } } @@ -500,26 +502,19 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) effects->source_buffer = txl->color; /* latest updated texture */ effects->target_buffer = fbl->effect_color_fb; /* next target to render to */ - /* Temporal Anti-Aliasing MUST come first */ - EEVEE_temporal_sampling_draw(vedata); - /* Post process stack (order matters) */ EEVEE_motion_blur_draw(vedata); EEVEE_depth_of_field_draw(vedata); + EEVEE_temporal_sampling_draw(vedata); EEVEE_bloom_draw(vedata); /* Save the final texture and framebuffer for final transformation or read. */ effects->final_tx = effects->source_buffer; effects->final_fb = (effects->target_buffer != fbl->main_color_fb) ? fbl->main_fb : fbl->effect_fb; if ((effects->enabled_effects & EFFECT_TAA) && - (effects->enabled_effects & (EFFECT_BLOOM | EFFECT_DOF | EFFECT_MOTION_BLUR)) == 0) + (effects->source_buffer == txl->taa_history)) { - if (!effects->swap_double_buffer) { - effects->final_fb = fbl->double_buffer_fb; - } - else { - effects->final_fb = fbl->main_fb; - } + effects->final_fb = fbl->taa_history_fb; } /* If no post processes is enabled, buffers are still not swapped, do it now. */ @@ -540,6 +535,7 @@ void EEVEE_draw_effects(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) /* Update double buffer status if render mode. */ if (DRW_state_is_image_render()) { stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL); + stl->g_data->valid_taa_history = (txl->taa_history != NULL);; } } -- cgit v1.2.3