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:
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);;
}
}