diff options
4 files changed, 25 insertions, 24 deletions
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl index ee5a46ae7c8..1da1b2ad13c 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl @@ -8,14 +8,7 @@ uniform float mixFactor; void main() { ivec2 texel = ivec2(gl_FragCoord.xy); - vec4 color_buffer = texelFetch(colorBuffer, texel, 0); - if (mixFactor == 1.0) - { - colorOutput = color_buffer; - } - else { - vec4 history_buffer = texelFetch(historyBuffer, texel, 0); - colorOutput = mix(history_buffer, color_buffer, mixFactor); - } + vec4 history_buffer = texelFetch(historyBuffer, texel, 0); + colorOutput = mix(history_buffer, color_buffer, mixFactor); } diff --git a/source/blender/draw/engines/workbench/workbench_effect_aa.c b/source/blender/draw/engines/workbench/workbench_effect_aa.c index 4f1ca7f561b..95a81649522 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_aa.c +++ b/source/blender/draw/engines/workbench/workbench_effect_aa.c @@ -61,11 +61,23 @@ void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx) DRW_draw_pass(psl->effect_aa_pass); } else if (TAA_ENABLED(wpd)) { - GPU_framebuffer_bind(fbl->effect_fb); - DRW_transform_to_display(tx); - - GPU_framebuffer_bind(dfbl->color_only_fb); - workbench_taa_draw_pass(effect_info, psl->effect_aa_pass); + /* + * when drawing the first TAA frame, we transform directly to the + * color_only_fb as the TAA shader is just performing a direct copy. + * the workbench_taa_draw_screen_end will fill the history buffer + * for the other iterations. + */ + if (effect_info->jitter_index == 1) + { + GPU_framebuffer_bind(dfbl->color_only_fb); + DRW_transform_to_display(tx); + } + else { + GPU_framebuffer_bind(fbl->effect_fb); + DRW_transform_to_display(tx); + GPU_framebuffer_bind(dfbl->color_only_fb); + DRW_draw_pass(psl->effect_aa_pass); + } workbench_taa_draw_scene_end(vedata); } else { diff --git a/source/blender/draw/engines/workbench/workbench_effect_taa.c b/source/blender/draw/engines/workbench/workbench_effect_taa.c index 43dfbd235b6..0b4cc0a4e5b 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_taa.c +++ b/source/blender/draw/engines/workbench/workbench_effect_taa.c @@ -56,6 +56,7 @@ static void workbench_taa_jitter_init_order(float (*table)[2], int num) /* move jitter table so that closest sample is in center */ for (int index = 0; index < num; index++) { sub_v2_v2(table[index], table[closest_index]); + mul_v2_fl(table[index], 2.0f); } /* swap center sample to the start of the table */ @@ -104,7 +105,8 @@ int workbench_taa_calculate_num_iterations(WORKBENCH_Data *vedata) { result = 16; } - else { + else + { result = 32; } } @@ -203,11 +205,12 @@ void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata) WORKBENCH_EffectInfo *effect_info = stl->effects; const float *viewport_size = DRW_viewport_size_get(); int num_samples = 8; - float (*samples)[2] = e_data.jitter_8; + float (*samples)[2]; float mix_factor; num_samples = workbench_taa_calculate_num_iterations(vedata); switch (num_samples) { + default: case 8: samples = e_data.jitter_8; break; @@ -215,7 +218,6 @@ void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata) samples = e_data.jitter_16; break; case 32: - default: samples = e_data.jitter_32; break; } @@ -262,9 +264,9 @@ void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata) * default depth buffer */ const WORKBENCH_StorageList *stl = vedata->stl; - const WORKBENCH_EffectInfo *effect_info = stl->effects; const WORKBENCH_FramebufferList *fbl = vedata->fbl; const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); + WORKBENCH_EffectInfo *effect_info = stl->effects; if (effect_info->jitter_index == 1) { GPU_framebuffer_blit(dfbl->depth_only_fb, 0, fbl->depth_buffer_fb, 0, GPU_DEPTH_BIT); @@ -276,11 +278,6 @@ void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata) GPU_framebuffer_blit(dfbl->color_only_fb, 0, fbl->effect_taa_fb, 0, GPU_COLOR_BIT); DRW_viewport_matrix_override_unset_all(); -} - -void workbench_taa_draw_pass(WORKBENCH_EffectInfo *effect_info, DRWPass *pass) -{ - DRW_draw_pass(pass); copy_m4_m4(effect_info->last_mat, effect_info->curr_mat); if (effect_info->jitter_index != 0) { diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index a1d829280ef..b240c0a5c3a 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -257,7 +257,6 @@ DRWPass *workbench_fxaa_create_pass(GPUTexture **color_buffer_tx); void workbench_taa_engine_init(WORKBENCH_Data *vedata); void workbench_taa_engine_free(void); DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx); -void workbench_taa_draw_pass(WORKBENCH_EffectInfo *effect_info, /*WORKBENCH_PrivateData *wpd, , GPUFrameBuffer *fb, GPUTexture *tx, */DRWPass *effect_aa_pass); void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata); void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata); void workbench_taa_view_updated(WORKBENCH_Data *vedata); |