[Bf-blender-cvs] [a3055b75fbf] tmp-workbench-rewrite2: cavity & outline (needs refactor)

Miguel Pozo noreply at git.blender.org
Fri Oct 21 21:11:48 CEST 2022


Commit: a3055b75fbf4d16041ada50eee99c2c79486423b
Author: Miguel Pozo
Date:   Wed Oct 19 20:09:40 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rBa3055b75fbf4d16041ada50eee99c2c79486423b

cavity & outline (needs refactor)

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
M	source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
M	source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
A	source/blender/draw/engines/workbench/shaders/workbench_next_merge_depth_frag.glsl
A	source/blender/draw/engines/workbench/workbench_effect_cavity.cc
M	source/blender/draw/engines/workbench/workbench_engine.cc
M	source/blender/draw/engines/workbench/workbench_mesh_passes.cc
M	source/blender/draw/engines/workbench/workbench_private.hh
A	source/blender/draw/engines/workbench/workbench_resources.cc
M	source/blender/draw/engines/workbench/workbench_shader_cache.cc
M	source/blender/draw/engines/workbench/workbench_shader_shared.h

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index d84f0df816b..7a649bb67a1 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -157,6 +157,7 @@ set(SRC
   engines/workbench/workbench_effect_antialiasing.c
   engines/workbench/workbench_effect_antialiasing.cc
   engines/workbench/workbench_effect_cavity.c
+  engines/workbench/workbench_effect_cavity.cc
   engines/workbench/workbench_effect_dof.c
   engines/workbench/workbench_effect_outline.c
   engines/workbench/workbench_engine.c
@@ -166,6 +167,7 @@ set(SRC
   engines/workbench/workbench_mesh_passes.cc
   engines/workbench/workbench_opaque.c
   engines/workbench/workbench_render.c
+  engines/workbench/workbench_resources.cc
   engines/workbench/workbench_shader.cc
   engines/workbench/workbench_shader_cache.cc
   engines/workbench/workbench_shadow.c
@@ -471,6 +473,7 @@ set(GLSL_SRC
   engines/workbench/shaders/workbench_matcap_lib.glsl
   engines/workbench/shaders/workbench_material_lib.glsl
   engines/workbench/shaders/workbench_merge_infront_frag.glsl
+  engines/workbench/shaders/workbench_next_merge_depth_frag.glsl
   engines/workbench/shaders/workbench_prepass_frag.glsl
   engines/workbench/shaders/workbench_prepass_hair_vert.glsl
   engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
index 5b8fee31f45..8c4875ca3e2 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
@@ -17,18 +17,6 @@ GPU_SHADER_CREATE_INFO(workbench_composite)
     .fragment_source("workbench_composite_frag.glsl")
     .additional_info("draw_fullscreen", "draw_view");
 
-GPU_SHADER_CREATE_INFO(workbench_next_composite)
-    .local_group_size(8, 8)
-    .sampler(3, ImageType::FLOAT_2D, "normal_tx")
-    .sampler(4, ImageType::FLOAT_2D, "material_tx")
-    .sampler(5, ImageType::DEPTH_2D, "depth_tx")
-    .uniform_buf(WB_WORLD_SLOT, "WorldData", "world_data")
-    .push_constant(Type::BOOL, "forceShadowing")
-    .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_color_img")
-    .typedef_source("workbench_shader_shared.h")
-    .compute_source("workbench_composite_comp.glsl")
-    .additional_info("draw_view");
-
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -55,23 +43,69 @@ GPU_SHADER_CREATE_INFO(workbench_composite_flat)
 /** \} */
 
 /* -------------------------------------------------------------------- */
-/** \name Lighting Type
+/** \name Workbench Next
  * \{ */
 
-GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_studio)
-    .define("WORKBENCH_LIGHTING_STUDIO")
-    .additional_info("workbench_next_composite")
-    .do_static_compilation(true);
+GPU_SHADER_CREATE_INFO(workbench_next_composite)
+    .local_group_size(8, 8)
+    .sampler(3, ImageType::FLOAT_2D, "normal_tx")
+    .sampler(4, ImageType::FLOAT_2D, "material_tx")
+    .sampler(5, ImageType::DEPTH_2D, "depth_tx")
+    .uniform_buf(WB_WORLD_SLOT, "WorldData", "world_data")
+    .push_constant(Type::BOOL, "forceShadowing")
+    .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_color_img")
+    .typedef_source("workbench_shader_shared.h")
+    .compute_source("workbench_composite_comp.glsl")
+    .additional_info("draw_view");
+
+// Lighting
+
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_studio).define("WORKBENCH_LIGHTING_STUDIO");
 
 GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_matcap)
     .define("WORKBENCH_LIGHTING_MATCAP")
-    .sampler(WB_MATCAP_SLOT, ImageType::FLOAT_2D_ARRAY, "matcap_tx")
-    .additional_info("workbench_next_composite")
-    .do_static_compilation(true);
+    .sampler(WB_MATCAP_SLOT, ImageType::FLOAT_2D_ARRAY, "matcap_tx");
 
-GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_flat)
-    .define("WORKBENCH_LIGHTING_FLAT")
-    .additional_info("workbench_next_composite")
-    .do_static_compilation(true);
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_flat).define("WORKBENCH_LIGHTING_FLAT");
+
+// Effects
+
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_curvature)
+    .define("WORKBENCH_CURVATURE")
+    .sampler(6, ImageType::UINT_2D, "object_id_tx");
+
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_cavity)
+    .define("WORKBENCH_CAVITY")
+    .sampler(7, ImageType::FLOAT_2D, "jitter_tx") /* TODO(pragma37): GPU_SAMPLER_REPEAT is set in
+                                                     CavityEffect, it doesn't work here ? */
+    .uniform_buf(5, "CavitySamples", "cavity_samples", Frequency::PASS);
+
+// Variations
+
+#define WORKBENCH_FINAL_VARIATION(name, ...) \
+  GPU_SHADER_CREATE_INFO(name).additional_info(__VA_ARGS__).do_static_compilation(true);
+
+#define WORKBENCH_CURVATURE_VARIATIONS(prefix, ...) \
+  WORKBENCH_FINAL_VARIATION(prefix##_curvature, "workbench_next_resolve_curvature", __VA_ARGS__) \
+  WORKBENCH_FINAL_VARIATION(prefix##_no_curvature, __VA_ARGS__)
+
+#define WORKBENCH_CAVITY_VARIATIONS(prefix, ...) \
+  WORKBENCH_CURVATURE_VARIATIONS(prefix##_cavity, "workbench_next_resolve_cavity", __VA_ARGS__) \
+  WORKBENCH_CURVATURE_VARIATIONS(prefix##_no_cavity, __VA_ARGS__)
+
+#define WORKBENCH_LIGHTING_VARIATIONS(prefix, ...) \
+  WORKBENCH_CAVITY_VARIATIONS( \
+      prefix##_opaque_studio, "workbench_next_resolve_opaque_studio", __VA_ARGS__) \
+  WORKBENCH_CAVITY_VARIATIONS( \
+      prefix##_opaque_matcap, "workbench_next_resolve_opaque_matcap", __VA_ARGS__) \
+  WORKBENCH_CAVITY_VARIATIONS( \
+      prefix##_opaque_flat, "workbench_next_resolve_opaque_flat", __VA_ARGS__)
+
+WORKBENCH_LIGHTING_VARIATIONS(workbench_next_resolve, "workbench_next_composite");
+
+#undef WORKBENCH_FINAL_VARIATION
+#undef WORKBENCH_CURVATURE_VARIATIONS
+#undef WORKBENCH_CAVITY_VARIATIONS
+#undef WORKBENCH_LIGHTING_VARIATIONS
 
 /** \} */
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
index e5ba0390244..03dd3a266e4 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
@@ -8,3 +8,9 @@ GPU_SHADER_CREATE_INFO(workbench_merge_infront)
     .fragment_source("workbench_merge_infront_frag.glsl")
     .additional_info("draw_fullscreen")
     .do_static_compilation(true);
+
+GPU_SHADER_CREATE_INFO(workbench_next_merge_depth)
+    .sampler(0, ImageType::DEPTH_2D, "depth_tx")
+    .fragment_source("workbench_next_merge_depth_frag.glsl")
+    .additional_info("draw_fullscreen")
+    .do_static_compilation(true);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
index e7ca868a4ff..d715825c268 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
@@ -5,6 +5,12 @@
 /*  From The Alchemy screen-space ambient obscurance algorithm
  * http://graphics.cs.williams.edu/papers/AlchemyHPG11/VV11AlchemyAO.pdf */
 
+#ifdef WORKBENCH_CAVITY
+#  define USE_CAVITY
+#  define cavityJitter jitter_tx
+#  define samples_coords cavity_samples.samples
+#endif
+
 #ifdef USE_CAVITY
 
 void cavity_compute(vec2 screenco,
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
index 40668e5a356..b55c627957b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
@@ -3,6 +3,8 @@
 #pragma BLENDER_REQUIRE(workbench_common_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_matcap_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_world_light_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_cavity_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_curvature_lib.glsl)
 
 void main()
 {
@@ -34,13 +36,49 @@ void main()
 #ifdef WORKBENCH_LIGHTING_FLAT
     color.rgb = base_color;
 #endif
+
+#if defined(WORKBENCH_CAVITY) || defined(WORKBENCH_CURVATURE)
+    float cavity = 0.0, edges = 0.0, curvature = 0.0;
+
+#  ifdef WORKBENCH_CAVITY
+    cavity_compute(uv, depth_tx, normal_tx, cavity, edges);
+    // color.rgb = vec3(cavity, edges, 0);
+#  endif
+
+#  ifdef WORKBENCH_CURVATURE
+    curvature_compute(uv, object_id_tx, normal_tx, curvature);
+    // color.rgb = vec3(curvature);
+#  endif
+
+    float final_cavity_factor = clamp(
+        (1.0 - cavity) * (1.0 + edges) * (1.0 + curvature), 0.0, 4.0);
+
+    color.rgb *= final_cavity_factor;
+    // color.rgb *= vec3(0, 1, 0);
+
+#endif
+
     color.a = 1.0f;
+  }
+
+#ifdef WORKBENCH_OUTLINE
+  vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.ui_scale;
+
+  uint center_id = texture(object_id_tx, uv).r;
+  uvec4 adjacent_ids = uvec4(texture(object_id_tx, uv + offset.zy).r,
+                             texture(object_id_tx, uv - offset.zy).r,
+                             texture(object_id_tx, uv + offset.xz).r,
+                             texture(object_id_tx, uv - offset.xz).r);
 
+  float outline_opacity = 1.0 - dot(vec4(equal(uvec4(center_id), adjacent_ids)), vec4(0.25));
+  color = mix(color, world_data.object_outline_color, outline_opacity);
+#endif
+
+  if (color != world_data.background_color) {
     /* TODO(fclem): Port the TAA shader that does this tranformation. */
     /* Use log2 space to avoid highlights creating too much aliasing. */
     /* TODO(pragma37): Re-enable */
     // color.rgb = log2(color.rgb + 0.5);
-
     imageStore(out_color_img, texel, color);
   }
 }
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 a6f7a1f522a..5d120560671 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cur

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list