Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-09-10 00:24:06 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-09-10 00:26:14 +0300
commit6b551c0b8cb0a3de5fe9ae5e9f9ee3181cd931fc (patch)
treec099c311118e864fff4500338ff635918033df83 /source/blender/draw/engines/eevee/eevee_effects.c
parentd69d68621fbc382b5a46c6c9edb191f1f7848aee (diff)
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].
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_effects.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c70
1 files changed, 33 insertions, 37 deletions
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);;
}
}