[Bf-blender-cvs] [98360afb33c] tmp-overlay-engine: Overlay Engine: Add FXAA as base Antialiasing
Clément Foucault
noreply at git.blender.org
Sun Nov 24 02:03:09 CET 2019
Commit: 98360afb33cf62df7ab6cf06eccf08e63f12eb7f
Author: Clément Foucault
Date: Sat Nov 23 14:14:15 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB98360afb33cf62df7ab6cf06eccf08e63f12eb7f
Overlay Engine: Add FXAA as base Antialiasing
This will be enhanced by TAA or other technique.
===================================================================
M source/blender/draw/CMakeLists.txt
A source/blender/draw/engines/overlay/overlay_antialiasing.c
M source/blender/draw/engines/overlay/overlay_armature.c
M source/blender/draw/engines/overlay/overlay_edit_mesh.c
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_grid.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
A source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 704d51af777..13aecba515d 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -118,6 +118,7 @@ set(SRC
engines/gpencil/gpencil_shader_fx.c
engines/select/select_draw_utils.c
engines/select/select_engine.c
+ engines/overlay/overlay_antialiasing.c
engines/overlay/overlay_armature.c
engines/overlay/overlay_engine.c
engines/overlay/overlay_edit_curve.c
@@ -302,6 +303,7 @@ data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl SRC)
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/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
new file mode 100644
index 00000000000..576a20bbbf7
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_antialiasing.c
@@ -0,0 +1,134 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2019, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "overlay_private.h"
+
+void OVERLAY_antialiasing_init(OVERLAY_Data *vedata)
+{
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
+ OVERLAY_TextureList *txl = vedata->txl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+ if (!DRW_state_is_fbo()) {
+ pd->use_antialiasing = false;
+ return;
+ }
+
+ /* TODO Get real userpref option and remove MSAA buffer. */
+ pd->use_antialiasing = dtxl->multisample_color != NULL;
+
+ if (pd->use_antialiasing) {
+ 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);
+
+ GPU_framebuffer_ensure_config(
+ &fbl->overlay_color_only_fb,
+ {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx)});
+ GPU_framebuffer_ensure_config(
+ &fbl->overlay_default_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx)});
+ GPU_framebuffer_ensure_config(&fbl->overlay_in_front_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
+ GPU_ATTACHMENT_TEXTURE(txl->overlay_color_tx)});
+
+ GPU_framebuffer_ensure_config(
+ &fbl->overlay_color_only_history_fb,
+ {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->overlay_color_history_tx)});
+ GPU_framebuffer_ensure_config(&fbl->overlay_default_history_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth),
+ GPU_ATTACHMENT_TEXTURE(txl->overlay_color_history_tx)});
+ GPU_framebuffer_ensure_config(&fbl->overlay_in_front_history_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front),
+ GPU_ATTACHMENT_TEXTURE(txl->overlay_color_history_tx)});
+ }
+ else {
+ /* Just a copy of the defaults framebuffers. */
+ GPU_framebuffer_ensure_config(&fbl->overlay_color_only_fb,
+ {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+ GPU_framebuffer_ensure_config(
+ &fbl->overlay_default_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+ GPU_framebuffer_ensure_config(
+ &fbl->overlay_in_front_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+ }
+}
+
+void OVERLAY_antialiasing_cache_init(OVERLAY_Data *vedata)
+{
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
+ OVERLAY_TextureList *txl = vedata->txl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+ OVERLAY_PassList *psl = vedata->psl;
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ struct GPUShader *sh;
+ DRWShadingGroup *grp;
+
+ if (pd->use_antialiasing) {
+ 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);
+ }
+}
+
+void OVERLAY_antialiasing_start(OVERLAY_Data *vedata)
+{
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+ if (pd->use_antialiasing) {
+ float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ GPU_framebuffer_bind(fbl->overlay_default_fb);
+ GPU_framebuffer_clear_color(fbl->overlay_default_fb, clear_col);
+ }
+}
+
+void OVERLAY_antialiasing_end(OVERLAY_Data *vedata)
+{
+ OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
+ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+
+ if (pd->use_antialiasing) {
+ GPU_framebuffer_bind(fbl->overlay_color_only_fb);
+ DRW_draw_pass(psl->antialiasing_merge_ps);
+
+ GPU_framebuffer_bind(dfbl->default_fb);
+ DRW_draw_pass(psl->antialiasing_ps);
+ }
+}
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index 5338698fa80..75a056a467a 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -2311,14 +2311,13 @@ void OVERLAY_armature_in_front_draw(OVERLAY_Data *vedata)
void OVERLAY_pose_draw(OVERLAY_Data *vedata)
{
OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
if (psl->armature_bone_select_ps != NULL) {
- DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-
DRW_draw_pass(psl->armature_bone_select_ps);
if (DRW_state_is_fbo()) {
- GPU_framebuffer_clear_depth(dfbl->default_fb, 1.0f);
+ GPU_framebuffer_clear_depth(fbl->overlay_default_fb, 1.0f);
}
/* Selection still works because we are drawing only the pose bones in this case. */
diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.c b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
index 396fb0ec865..78b22a8e7d0 100644
--- a/source/blender/draw/engines/overlay/overlay_edit_mesh.c
+++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.c
@@ -365,7 +365,7 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
{
OVERLAY_PassList *psl = vedata->psl;
OVERLAY_PrivateData *pd = vedata->stl->pd;
- DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
DRW_draw_pass(psl->edit_mesh_weight_ps);
DRW_draw_pass(psl->edit_mesh_analysis_ps);
@@ -384,8 +384,8 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
DRW_view_set_active(NULL);
- GPU_framebuffer_bind(dfbl->in_front_fb);
- GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
+ GPU_framebuffer_bind(fbl->overlay_in_front_fb);
+ GPU_framebuffer_clear_depth(fbl->overlay_in_front_fb, 1.0f);
DRW_draw_pass(psl->edit_mesh_normals_ps);
DRW_view_set_active(pd->view_edit_edges);
@@ -394,7 +394,7 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
DRW_view_set_active(pd->view_edit_verts);
DRW_draw_pass(psl->edit_mesh_verts_ps[NOT_IN_FRONT]);
- GPU_framebuffer_bind(dfbl->default_fb);
+ GPU_framebuffer_bind(fbl->overlay_default_fb);
}
else {
const DRWContextState *draw_ctx = DRW_context_state_get();
@@ -408,7 +408,7 @@ void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
/* In the case of single ghost object edit (common case for retopology):
* we clear the depth buffer so that only the depth of the retopo mesh
* is occluding the edit cage. */
- GPU_framebuffer_clear_depth(dfbl->default_fb, 1.0f);
+ GPU_framebuffer_clear_depth(fbl->overlay_default_fb, 1.0f);
}
DRW_draw_pass(psl->edit_mesh_depth_ps[IN_FRONT]);
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 7f406ce73de..3abe9ce18dd 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -50,6 +50,8 @@ static void OVERLAY_engine_init(void *vedata)
stl->pd->ctx_mode = CTX_data_mode_enum_ex(
draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode);
+ OVERLAY_antialiasing_init(vedata);
+
switch (stl->pd->ctx_mode) {
case CTX_MODE_EDIT_MESH:
OVERLAY_edit_mesh_init(vedata);
@@ -133,6 +135,7 @@ static void OVERLAY_cache_init(void *vedata)
BLI_assert(!"Draw mode invalid");
break;
}
+ OVERLAY_antialiasing
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list