[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