Commit: 4926e7413d5b58fba264cdd267586174f8fab816 Author: Clément Foucault Date: Fri Nov 29 15:02:03 2019 +0100 Branches: tmp-overlay-engine https://developer.blender.org/rB4926e7413d5b58fba264cdd267586174f8fab816
Overlay Engine: Add SMAA to replace FXAA This gets rid of the TAA which needs to be added back =================================================================== M source/blender/draw/CMakeLists.txt M source/blender/draw/engines/overlay/overlay_antialiasing.c M source/blender/draw/engines/overlay/overlay_engine.c M source/blender/draw/engines/overlay/overlay_outline.c M source/blender/draw/engines/overlay/overlay_private.h M source/blender/draw/engines/overlay/overlay_shader.c M source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl A source/blender/draw/engines/overlay/shaders/antialiasing_vert.glsl A source/blender/draw/intern/shaders/common_smaa_lib.glsl A source/blender/draw/intern/smaa_textures.h =================================================================== diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 13aecba515d..667f56b47b5 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -153,6 +153,7 @@ set(SRC intern/draw_manager_profiling.h intern/draw_manager_text.h intern/draw_view.h + intern/smaa_textures.h engines/basic/basic_engine.h engines/eevee/eevee_engine.h engines/eevee/eevee_lightcache.h @@ -267,6 +268,7 @@ data_to_c_simple(intern/shaders/common_hair_lib.glsl SRC) data_to_c_simple(intern/shaders/common_hair_refine_vert.glsl SRC) data_to_c_simple(intern/shaders/common_view_lib.glsl SRC) data_to_c_simple(intern/shaders/common_fxaa_lib.glsl SRC) +data_to_c_simple(intern/shaders/common_smaa_lib.glsl SRC) data_to_c_simple(intern/shaders/common_fullscreen_vert.glsl SRC) data_to_c_simple(engines/gpencil/shaders/gpencil_fill_vert.glsl SRC) @@ -304,6 +306,7 @@ data_to_c_simple(engines/select/shaders/selection_id_3D_vert.glsl SRC) data_to_c_simple(engines/select/shaders/selection_id_frag.glsl SRC) data_to_c_simple(engines/overlay/shaders/antialiasing_frag.glsl SRC) +data_to_c_simple(engines/overlay/shaders/antialiasing_vert.glsl SRC) data_to_c_simple(engines/overlay/shaders/armature_dof_vert.glsl SRC) data_to_c_simple(engines/overlay/shaders/armature_envelope_outline_vert.glsl SRC) data_to_c_simple(engines/overlay/shaders/armature_envelope_solid_frag.glsl SRC) diff --git a/source/blender/draw/engines/overlay/overlay_antialiasing.c b/source/blender/draw/engines/overlay/overlay_antialiasing.c index 28e20d89718..779ec1035a3 100644 --- a/source/blender/draw/engines/overlay/overlay_antialiasing.c +++ b/source/blender/draw/engines/overlay/overlay_antialiasing.c @@ -25,6 +25,12 @@ #include "ED_screen.h" #include "overlay_private.h" +#include "smaa_textures.h" + +struct { + GPUTexture *smaa_search_tx; + GPUTexture *smaa_area_tx; +} e_data = {NULL}; void OVERLAY_antialiasing_reset(OVERLAY_Data *vedata) { @@ -50,6 +56,38 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata) pd->antialiasing.enabled = dtxl->multisample_color != NULL; if (pd->antialiasing.enabled) { + + if (e_data.smaa_search_tx == NULL) { + e_data.smaa_search_tx = GPU_texture_create_nD(SEARCHTEX_WIDTH, + SEARCHTEX_HEIGHT, + 0, + 2, + searchTexBytes, + GPU_R8, + GPU_DATA_UNSIGNED_BYTE, + 0, + false, + NULL); + + e_data.smaa_area_tx = GPU_texture_create_nD(AREATEX_WIDTH, + AREATEX_HEIGHT, + 0, + 2, + areaTexBytes, + GPU_RG8, + GPU_DATA_UNSIGNED_BYTE, + 0, + false, + NULL); + GPU_texture_bind(e_data.smaa_area_tx, 0); + GPU_texture_filter_mode(e_data.smaa_area_tx, true); + GPU_texture_unbind(e_data.smaa_area_tx); + + GPU_texture_bind(e_data.smaa_search_tx, 0); + GPU_texture_filter_mode(e_data.smaa_search_tx, true); + GPU_texture_unbind(e_data.smaa_search_tx); + } + pd->antialiasing.target_sample = 4; bool valid_history = true; @@ -57,8 +95,11 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata) valid_history = false; } + DRW_texture_ensure_fullscreen_2d(&txl->temp_depth_tx, GPU_DEPTH24_STENCIL8, 0); DRW_texture_ensure_fullscreen_2d(&txl->overlay_color_tx, GPU_RGBA8, DRW_TEX_FILTER); DRW_texture_ensure_fullscreen_2d(&txl->overlay_color_history_tx, GPU_RGBA8, DRW_TEX_FILTER); + DRW_texture_ensure_fullscreen_2d(&txl->smaa_edge_tx, GPU_RG8, DRW_TEX_FILTER); + DRW_texture_ensure_fullscreen_2d(&txl->smaa_blend_tx, GPU_RGBA8, DRW_TEX_FILTER); GPU_framebuffer_ensure_config( &fbl->overlay_color_only_fb, @@ -73,6 +114,12 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata) GPU_framebuffer_ensure_config( &fbl->overlay_color_history_fb, {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->overlay_color_history_tx)}); + GPU_framebuffer_ensure_config( + &fbl->smaa_edge_fb, + {GPU_ATTACHMENT_TEXTURE(txl->temp_depth_tx), GPU_ATTACHMENT_TEXTURE(txl->smaa_edge_tx)}); + GPU_framebuffer_ensure_config( + &fbl->smaa_blend_fb, + {GPU_ATTACHMENT_TEXTURE(txl->temp_depth_tx), GPU_ATTACHMENT_TEXTURE(txl->smaa_blend_tx)}); /* Test if we can do TAA */ if (valid_history) { @@ -102,7 +149,8 @@ void OVERLAY_antialiasing_init(OVERLAY_Data *vedata) /* For nr = 0,we should sample {0, 0} (goes through the FXAA branch). */ float ofs[2] = {samples_pos[nr][0] / 6.0f, samples_pos[nr][1] / 6.0f}; - window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / viewport_size[1]); + // window_translate_m4(winmat, persmat, ofs[0] / viewport_size[0], ofs[1] / + // viewport_size[1]); const DRWView *default_view = DRW_view_default_get(); pd->view_default = DRW_view_create_sub(default_view, viewmat, winmat); @@ -143,48 +191,33 @@ void OVERLAY_antialiasing_cache_init(OVERLAY_Data *vedata) DRWShadingGroup *grp; if (pd->antialiasing.enabled) { - bool do_fxaa = (pd->antialiasing.sample == 0); - if (do_fxaa) { - DRW_PASS_CREATE(psl->antialiasing_merge_ps, - DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_UNDER_PREMUL); - - sh = OVERLAY_shader_antialiasing_merge(); - grp = DRW_shgroup_create(sh, psl->antialiasing_merge_ps); - DRW_shgroup_uniform_texture_ref(grp, "srcTexture", &dtxl->color); - DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f); - DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - - DRW_PASS_CREATE(psl->antialiasing_ps, DRW_STATE_WRITE_COLOR); - - sh = OVERLAY_shader_antialiasing(); - grp = DRW_shgroup_create(sh, psl->antialiasing_ps); - DRW_shgroup_uniform_texture_ref(grp, "srcTexture", &txl->overlay_color_tx); - DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - } - else { - DRW_PASS_CREATE(psl->antialiasing_merge_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM); - - /* TODO do not even render if not necessary. */ - float alpha = 0.0f; - if (pd->antialiasing.sample <= pd->antialiasing.target_sample) { - alpha = 1.0f / (pd->antialiasing.sample + 1); - } - - sh = OVERLAY_shader_antialiasing_accum(); - grp = DRW_shgroup_create(sh, psl->antialiasing_merge_ps); - DRW_shgroup_uniform_texture_ref(grp, "srcTexture", &txl->overlay_color_tx); - DRW_shgroup_uniform_float_copy(grp, "alpha", alpha); - DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - - DRW_PASS_CREATE(psl->antialiasing_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL); - - /* Reuse merge shader. */ - sh = OVERLAY_shader_antialiasing_merge(); - grp = DRW_shgroup_create(sh, psl->antialiasing_ps); - DRW_shgroup_uniform_texture_ref(grp, "srcTexture", &txl->overlay_color_history_tx); - DRW_shgroup_uniform_float_copy(grp, "alpha", 1.0f); - DRW_shgroup_call_procedural_triangles(grp, NULL, 1); - } + DRW_PASS_CREATE(psl->smaa_edge_detect_ps, + DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS); + DRW_PASS_CREATE(psl->smaa_blend_weight_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_STENCIL_EQUAL); + DRW_PASS_CREATE(psl->smaa_resolve_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL); + + sh = OVERLAY_shader_antialiasing(0); + grp = DRW_shgroup_create(sh, psl->smaa_edge_detect_ps); + DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); + DRW_shgroup_uniform_texture_ref(grp, "colorTex", &txl->overlay_color_tx); + DRW_shgroup_stencil_mask(grp, 0xFF); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + sh = OVERLAY_shader_antialiasing(1); + grp = DRW_shgroup_create(sh, psl->smaa_blend_weight_ps); + DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); + DRW_shgroup_uniform_texture_ref(grp, "edgesTex", &txl->smaa_edge_tx); + DRW_shgroup_uniform_texture(grp, "areaTex", e_data.smaa_area_tx); + DRW_shgroup_uniform_texture(grp, "searchTex", e_data.smaa_search_tx); + DRW_shgroup_stencil_mask(grp, 0xFF); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); + + sh = OVERLAY_shader_antialiasing(2); + grp = DRW_shgroup_create(sh, psl->smaa_resolve_ps); + DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); + DRW_shgroup_uniform_texture_ref(grp, "blendTex", &txl->smaa_blend_tx); + DRW_shgroup_uniform_texture_ref(grp, "colorTex", &txl->overlay_color_tx); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } } @@ -208,34 +241,24 @@ void OVERLAY_antialiasing_end(OVERLAY_Data *vedata) DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); if (pd->antialiasing.enabled) { - if (pd->antialiasing.sample == 0) { - /* First sample: Copy to history buffer and apply FXAA. */ - GPU_framebuffer_blit( - fbl->overlay_color_only_fb, 0, fbl->overlay_color_history_fb, 0, GPU_COLOR_BIT); - /* We merge default framebuffer with the overlay framebuffer to apply - * FXAA pass on the final image */ - GPU_framebuffer_bind(fbl->overlay_color_only_fb); - DRW_draw_pass(psl->antialiasing_merge_ps); - /* Do FXAA */ - GPU_framebuffer_bind(dfbl->default_fb); - DRW_draw_pass(psl->antialiasing_ps); - - pd->antialiasing.sample++; - - DRW_viewport_request_redraw(); - } - else { @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs