[Bf-blender-cvs] [a102b7ebe5f] tmp-workbench-rewrite: Workbench: Refactor: Add outline support

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


Commit: a102b7ebe5f15b37622b603e3c92199a58c592e0
Author: Clément Foucault
Date:   Tue Mar 3 02:29:05 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rBa102b7ebe5f15b37622b603e3c92199a58c592e0

Workbench: Refactor: Add outline support

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_effect_cavity.c
A	source/blender/draw/engines/workbench/workbench_effect_outline.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_opaque.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 692dc300d89..a25dbcf4721 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -104,6 +104,7 @@ set(SRC
   engines/workbench/workbench_effect_cavity.c
   engines/workbench/workbench_effect_dof.c
   engines/workbench/workbench_effect_fxaa.c
+  engines/workbench/workbench_effect_outline.c
   engines/workbench/workbench_effect_taa.c
   engines/workbench/workbench_engine.c
   engines/workbench/workbench_forward.c
@@ -255,6 +256,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_composite_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_deferred_composite_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_deferred_background_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_outline_frag.glsl SRC)
 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)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
index 8754b7147d9..e6bc4c7bbc6 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
@@ -16,7 +16,7 @@ void curvature_compute(vec2 uv,
 {
   curvature = 0.0;
 
-  vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.curvature_offset;
+  vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.ui_scale;
   uint object_up = texture(objectIdBuffer, uv + offset.zy).r;
   uint object_down = texture(objectIdBuffer, uv - offset.zy).r;
   uint object_right = texture(objectIdBuffer, uv + offset.xz).r;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index 69aadabe860..14758a62da7 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -29,7 +29,7 @@ struct WorldData {
 
   float curvature_ridge;
   float curvature_valley;
-  float curvature_offset;
+  float ui_scale;
   int matcap_orientation;
 };
 
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
new file mode 100644
index 00000000000..fb6fdb93462
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
@@ -0,0 +1,24 @@
+
+#pragma BLENDER_REQUIRE(workbench_data_lib.glsl)
+
+uniform usampler2D objectIdBuffer;
+
+in vec4 uvcoordsvar;
+
+out vec4 fragColor;
+
+void main()
+{
+  vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.ui_scale;
+  vec2 uv = uvcoordsvar.st;
+
+  uint center_id = texture(objectIdBuffer, uv).r;
+  uvec4 adjacent_ids = uvec4(texture(objectIdBuffer, uv + offset.zy).r,
+                             texture(objectIdBuffer, uv - offset.zy).r,
+                             texture(objectIdBuffer, uv + offset.xz).r,
+                             texture(objectIdBuffer, uv - offset.xz).r);
+
+  float outline_opacity = 1.0 - dot(vec4(equal(uvec4(center_id), adjacent_ids)), vec4(0.25));
+
+  fragColor = world_data.object_outline_color * outline_opacity;
+}
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 0f7a4f8f9c8..65918fe8d71 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -247,7 +247,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   }
 
   WORKBENCH_UBO_World *wd = &wpd->world_data;
-  wd->matcap_orientation = (wpd->shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
 
   studiolight_update_world(wpd, wpd->studio_light, wd);
 
@@ -255,11 +254,12 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   workbench_material_ubo_data(
       wpd, NULL, NULL, &wpd->material_ubo_data_curr[0], V3D_SHADING_MATERIAL_COLOR);
 
+  copy_v2_v2(wd->viewport_size, DRW_viewport_size_get());
+  copy_v2_v2(wd->viewport_size_inv, DRW_viewport_invert_size_get());
   copy_v3_v3(wd->object_outline_color, wpd->shading.object_outline_color);
   wd->object_outline_color[3] = 1.0f;
-
-  copy_v2_v2(wpd->world_data.viewport_size, DRW_viewport_size_get());
-  copy_v2_v2(wpd->world_data.viewport_size_inv, DRW_viewport_invert_size_get());
+  wd->ui_scale = G_draw.block.sizePixel;
+  wd->matcap_orientation = (wpd->shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
 
   workbench_shadow_world_data_update(wpd);
   workbench_cavity_data_update(wpd);
diff --git a/source/blender/draw/engines/workbench/workbench_effect_cavity.c b/source/blender/draw/engines/workbench/workbench_effect_cavity.c
index 5f7f8feb42d..1b60e1e064b 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_cavity.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_cavity.c
@@ -124,7 +124,6 @@ void workbench_cavity_data_update(WORKBENCH_PrivateData *wpd)
 
   wd->curvature_ridge = 0.5f / max_ff(SQUARE(shading->curvature_ridge_factor), 1e-4f);
   wd->curvature_valley = 0.7f / max_ff(SQUARE(shading->curvature_valley_factor), 1e-4f);
-  wd->curvature_offset = G_draw.block.sizePixel;
 }
 
 void workbench_cavity_cache_init(WORKBENCH_Data *data)
diff --git a/source/blender/draw/engines/workbench/workbench_effect_outline.c b/source/blender/draw/engines/workbench/workbench_effect_outline.c
new file mode 100644
index 00000000000..89260e9820d
--- /dev/null
+++ b/source/blender/draw/engines/workbench/workbench_effect_outline.c
@@ -0,0 +1,51 @@
+/*
+ * 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 2020, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "workbench_engine.h"
+#include "workbench_private.h"
+
+void workbench_outline_cache_init(WORKBENCH_Data *data)
+{
+  WORKBENCH_PassList *psl = data->psl;
+  WORKBENCH_PrivateData *wpd = data->stl->wpd;
+  DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+  struct GPUShader *sh;
+  DRWShadingGroup *grp;
+
+  if (OBJECT_OUTLINE_ENABLED(wpd)) {
+    int state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL;
+    DRW_PASS_CREATE(psl->outline_pass, state);
+
+    sh = workbench_shader_outline_get();
+
+    grp = DRW_shgroup_create(sh, psl->outline_pass);
+    DRW_shgroup_uniform_texture(grp, "objectIdBuffer", wpd->object_id_tx);
+    DRW_shgroup_uniform_texture(grp, "depthBuffer", dtxl->depth);
+    DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
+    DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+  }
+  else {
+    psl->outline_pass = NULL;
+  }
+}
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index b9017f9bfff..73bff11bb78 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -68,6 +68,13 @@ static void workbench_engine_init(void *ved)
   }
   wpd->dummy_image_tx = txl->dummy_image_tx;
 
+  if (OBJECT_ID_PASS_ENABLED(wpd)) {
+    wpd->object_id_tx = DRW_texture_pool_query_fullscreen(GPU_R16UI, &draw_engine_workbench);
+  }
+  else {
+    DRW_TEXTURE_FREE_SAFE(wpd->object_id_tx);
+  }
+
   workbench_opaque_engine_init(vedata);
   workbench_transparent_engine_init(vedata);
   //   workbench_volume_engine_init();
@@ -84,6 +91,7 @@ static void workbench_cache_init(void *ved)
   workbench_transparent_cache_init(vedata);
   workbench_shadow_cache_init(vedata);
   workbench_cavity_cache_init(vedata);
+  workbench_outline_cache_init(vedata);
 
   //   workbench_aa_create_pass(vedata);
   //   workbench_dof_create_pass(vedata);
@@ -363,6 +371,17 @@ static void workbench_cache_finish(void *ved)
                                   });
   }
 
+  if (wpd->object_id_tx) {
+    GPU_framebuffer_ensure_config(&fbl->id_clear_fb,
+                                  {
+                                      GPU_ATTACHMENT_NONE,
+                                      GPU_ATTACHMENT_TEXTURE(wpd->object_id_tx),
+                                  });
+  }
+  else {
+    GPU_FRAMEBUFFER_FREE_SAFE(fbl->id_clear_fb);
+  }
+
   workbench_update_material_ubos(wpd);
 
   /* TODO don't free reuse next redraw. */
@@ -387,6 +406,11 @@ static void workbench_draw_scene(void *ved)
   float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
   float clear_col_with_alpha[4] = {0.0f, 0.0f, 0.0f, 1.0f};
 
+  if (fbl->id_clear_fb) {
+    GPU_framebuffer_bind(fbl->id_clear_fb);
+    GPU_framebuffer_clear_color(fbl->id_clear_fb, clear_col);
+  }
+
   {
     GPU_framebuffer_bind(dfbl->in_front_fb);
     GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
@@ -442,8 +466,9 @@ static void workbench_draw_scene(void *ved)
     }
   }
 
-  /* TODO(fclem) outline */
-  // DRW_draw_pass(psl->outline_pass);
+  if (psl->outline_pass) {
+    DRW_draw_pass(psl->outline_pass);
+  }
 
   /* TODO(fclem) dof */
 
diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c
index b968f257007

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list