[Bf-blender-cvs] [bd6567b2622] tmp-workbench-rewrite: Workbench: Refactor: Antialiasing

Clément Foucault noreply at git.blender.org
Tue Mar 3 17:36:19 CET 2020


Commit: bd6567b262225e0eb5e392bc257c55e43a585ded
Author: Clément Foucault
Date:   Tue Mar 3 16:45:26 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rBbd6567b262225e0eb5e392bc257c55e43a585ded

Workbench: Refactor: Antialiasing

===================================================================

M	source/blender/draw/CMakeLists.txt
A	source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_effect_aa.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index a25dbcf4721..b48a5494782 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -260,6 +260,8 @@ data_to_c_simple(engines/workbench/shaders/workbench_effect_outline_frag.glsl SR
 data_to_c_simple(engines/workbench/shaders/workbench_effect_cavity_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_dof_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_fxaa_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_smaa_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_smaa_vert.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_taa_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
new file mode 100644
index 00000000000..95ca2c0c297
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
@@ -0,0 +1,14 @@
+
+in vec4 uvcoordsvar;
+
+out vec4 FragColor;
+
+uniform sampler2D colorBuffer;
+uniform vec2 invertedViewportSize;
+
+void main()
+{
+  ivec2 texel = ivec2(gl_FragCoord.xy);
+  FragColor = FxaaPixelShader(
+      uvcoordsvar.st, colorBuffer, invertedViewportSize, 1.0, 0.166, 0.0833);
+}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_vert.glsl
new file mode 100644
index 00000000000..95ca2c0c297
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_vert.glsl
@@ -0,0 +1,14 @@
+
+in vec4 uvcoordsvar;
+
+out vec4 FragColor;
+
+uniform sampler2D colorBuffer;
+uniform vec2 invertedViewportSize;
+
+void main()
+{
+  ivec2 texel = ivec2(gl_FragCoord.xy);
+  FragColor = FxaaPixelShader(
+      uvcoordsvar.st, colorBuffer, invertedViewportSize, 1.0, 0.166, 0.0833);
+}
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 5795268f794..b877c2c3f76 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
@@ -1,14 +1,11 @@
-uniform sampler2D historyBuffer;
+
 uniform sampler2D colorBuffer;
 
-out vec4 colorOutput;
+in vec4 uvcoordsvar;
 
-uniform float mixFactor;
+out vec4 fragColor;
 
 void main()
 {
-  ivec2 texel = ivec2(gl_FragCoord.xy);
-  vec4 color_buffer = texelFetch(colorBuffer, texel, 0);
-  vec4 history_buffer = texelFetch(historyBuffer, texel, 0);
-  colorOutput = mix(history_buffer, color_buffer, mixFactor);
+  fragColor = texture(colorBuffer, uvcoordsvar.st);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index af65acddb53..d7b50a5c748 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -208,7 +208,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   wpd->sh_cfg = draw_ctx->sh_cfg;
   wpd->vldata = vldata;
 
-  wpd->taa_sample_len = workbench_taa_calculate_num_iterations(wpd);
+  wpd->taa_sample_len = workbench_aa_sample_count_get(wpd);
 
   wpd->world_ubo = vldata->world_ubo;
 
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index a0e03fd12cb..eb15460a9dd 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -577,7 +577,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
   }
 
   {
-    workbench_aa_create_pass(vedata, &e_data.color_buffer_tx);
+    workbench_aa_cache_init(vedata);
   }
 
   {
@@ -1375,7 +1375,7 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
   }
 
   workbench_dof_draw_pass(vedata);
-  workbench_aa_draw_pass(vedata, e_data.composite_buffer_tx);
+  workbench_aa_draw_pass(vedata);
 }
 
 void workbench_deferred_draw_finish(WORKBENCH_Data *vedata)
diff --git a/source/blender/draw/engines/workbench/workbench_effect_aa.c b/source/blender/draw/engines/workbench/workbench_effect_aa.c
index 482cb81917f..94deacf27d5 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_aa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_aa.c
@@ -13,7 +13,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
- * Copyright 2016, Blender Foundation.
+ * Copyright 2020, Blender Foundation.
  */
 
 /** \file
@@ -22,71 +22,318 @@
 
 #include "ED_screen.h"
 
-#include "draw_color_management.h"
+#include "BLI_jitter_2d.h"
+
+#include "smaa_textures.h"
 
 #include "workbench_private.h"
 
-void workbench_aa_create_pass(WORKBENCH_Data *vedata, GPUTexture **tx)
+static struct {
+  bool init;
+  float jitter_5[5][2];
+  float jitter_8[8][2];
+  float jitter_11[11][2];
+  float jitter_16[16][2];
+  float jitter_32[32][2];
+} e_data = {false};
+
+static void workbench_taa_jitter_init_order(float (*table)[2], int num)
 {
-  WORKBENCH_StorageList *stl = vedata->stl;
-  WORKBENCH_PrivateData *wpd = stl->g_data;
-  WORKBENCH_PassList *psl = vedata->psl;
-  WORKBENCH_EffectInfo *effect_info = stl->effects;
+  BLI_jitter_init(table, num);
+
+  /* find closest element to center */
+  int closest_index = 0;
+  float closest_squared_distance = 1.0f;
+
+  for (int index = 0; index < num; index++) {
+    const float squared_dist = SQUARE(table[index][0]) + SQUARE(table[index][1]);
+    if (squared_dist < closest_squared_distance) {
+      closest_squared_distance = squared_dist;
+      closest_index = index;
+    }
+  }
+
+  /* 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);
+  }
 
-  if (workbench_is_taa_enabled(wpd)) {
-    psl->effect_aa_pass = workbench_taa_create_pass(vedata, tx);
+  /* swap center sample to the start of the table */
+  if (closest_index != 0) {
+    swap_v2_v2(table[0], table[closest_index]);
   }
-  else if (workbench_is_fxaa_enabled(wpd)) {
-    psl->effect_aa_pass = workbench_fxaa_create_pass(tx);
-    effect_info->jitter_index = 0;
+
+  /* sort list based on furtest distance with previous */
+  for (int i = 0; i < num - 2; i++) {
+    float f_squared_dist = 0.0;
+    int f_index = i;
+    for (int j = i + 1; j < num; j++) {
+      const float squared_dist = SQUARE(table[i][0] - table[j][0]) +
+                                 SQUARE(table[i][1] - table[j][1]);
+      if (squared_dist > f_squared_dist) {
+        f_squared_dist = squared_dist;
+        f_index = j;
+      }
+    }
+    swap_v2_v2(table[i + 1], table[f_index]);
+  }
+}
+
+static void workbench_taa_jitter_init(void)
+{
+  if (e_data.init == false) {
+    workbench_taa_jitter_init_order(e_data.jitter_5, 5);
+    workbench_taa_jitter_init_order(e_data.jitter_8, 8);
+    workbench_taa_jitter_init_order(e_data.jitter_11, 11);
+    workbench_taa_jitter_init_order(e_data.jitter_16, 16);
+    workbench_taa_jitter_init_order(e_data.jitter_32, 32);
+  }
+}
+
+BLI_INLINE bool workbench_taa_enabled(WORKBENCH_PrivateData *wpd)
+{
+  if (DRW_state_is_image_render()) {
+    const DRWContextState *draw_ctx = DRW_context_state_get();
+    if (draw_ctx->v3d) {
+      return draw_ctx->scene->display.viewport_aa > SCE_DISPLAY_AA_FXAA;
+    }
+    else {
+      return draw_ctx->scene->display.render_aa > SCE_DISPLAY_AA_FXAA;
+    }
+  }
+  else {
+    return !(IS_NAVIGATING(wpd) || wpd->is_playback) &&
+           wpd->preferences->viewport_aa > SCE_DISPLAY_AA_FXAA;
+  }
+}
+
+int workbench_aa_sample_count_get(WORKBENCH_PrivateData *wpd)
+{
+  const Scene *scene = DRW_context_state_get()->scene;
+  if (workbench_taa_enabled(wpd)) {
+    if (DRW_state_is_image_render()) {
+      const DRWContextState *draw_ctx = DRW_context_state_get();
+      if (draw_ctx->v3d) {
+        return scene->display.viewport_aa;
+      }
+      else {
+        return scene->display.render_aa;
+      }
+    }
+    else {
+      return wpd->preferences->viewport_aa;
+    }
+  }
+  else {
+    /* when no TAA is disabled return 0 to render a single sample
+     * see `workbench_render.c` */
+    return 0;
+  }
+}
+
+void workbench_aa_engine_init(WORKBENCH_Data *vedata)
+{
+  WORKBENCH_FramebufferList *fbl = vedata->fbl;
+  WORKBENCH_TextureList *txl = vedata->txl;
+  WORKBENCH_PrivateData *wpd = vedata->stl->g_data;
+  DrawEngineType *owner = (DrawEngineType *)&workbench_aa_engine_init;
+
+  if (wpd->taa_sample_len > 0) {
+    workbench_taa_jitter_init();
+
+    DRW_texture_ensure_fullscreen_2d(&txl->history_buffer_tx, GPU_RGBA16F, 0);
+    DRW_texture_ensure_fullscreen_2d(&txl->depth_buffer_tx, GPU_DEPTH24_STENCIL8, 0);
+
+    wpd->smaa_edge_tx = DRW_texture_pool_query_fullscreen(GPU_RG8, owner);
+    wpd->smaa_weight_tx = DRW_texture_pool_query_fullscreen(GPU_RGBA8, owner);
+
+    GPU_framebuffer_ensure_config(&fbl->antialiasing_fb,
+                                  {
+                                      GPU_ATTACHMENT_TEXTURE(txl->depth_buffer_tx),
+                                      GPU_ATTACHMENT_TEXTURE(txl->history_buffer_tx),
+                                  });
+
+    GPU_framebuffer_ensure_config(&fbl->smaa_edge_fb,
+                                  {
+                                      GPU_ATTACHMENT_NONE,
+                                      GPU_ATTACHMENT_TEXTURE(wpd->smaa_edge_tx),
+                                  });
+
+    GPU_framebuffer_ensure_config(&fbl->smaa_weight_fb,
+                                  {
+                                      GPU_ATTACHMENT_NONE,
+                                      GPU

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list