[Bf-blender-cvs] [7bc00aeabf2] tmp-wbench-next-shadow-backup: Workbench Next: Shadows: In front integration

Miguel Pozo noreply at git.blender.org
Mon Dec 19 13:11:59 CET 2022


Commit: 7bc00aeabf24ae6b8b2a5d99133f9178be953529
Author: Miguel Pozo
Date:   Fri Dec 16 17:29:36 2022 +0100
Branches: tmp-wbench-next-shadow-backup
https://developer.blender.org/rB7bc00aeabf24ae6b8b2a5d99133f9178be953529

Workbench Next: Shadows: In front integration

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

M	source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
M	source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl
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
M	source/blender/draw/engines/workbench/workbench_shadow.cc

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

diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
index ecccb2083b1..04fd4349d65 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
@@ -38,10 +38,10 @@ GPU_SHADER_CREATE_INFO(workbench_next_shadow_visibility_compute_common)
     .define("DRW_VIEW_LEN", "64")
     .storage_buf(0, Qualifier::READ, "ObjectBounds", "bounds_buf[]")
     .uniform_buf(2, "ExtrudedFrustum", "extruded_frustum")
-    .push_constant(Type::BOOL, "forced_fail_pass")
     .push_constant(Type::INT, "resource_len")
     .push_constant(Type::INT, "view_len")
     .push_constant(Type::INT, "visibility_word_per_draw")
+    .push_constant(Type::BOOL, "force_fail_method")
     .push_constant(Type::VEC3, "shadow_direction")
     .typedef_source("workbench_shader_shared.h")
     .compute_source("workbench_shadow_visibility_comp.glsl")
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl
index ddf655ec006..e638e68c80f 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl
@@ -86,7 +86,7 @@ void main()
 
 #ifdef DYNAMIC_PASS_SELECTION
   if (is_visible(box)) {
-    bool use_fail_pass = intersects_near_plane(box);
+    bool use_fail_pass = force_fail_method || intersects_near_plane(box);
     set_visibility(!use_fail_pass, use_fail_pass);
   }
   else {
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 8805657acfd..9c7bfb7c6c3 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -336,7 +336,12 @@ class Instance {
       }
     }
 
-    opaque_ps.draw(manager, view, resources, resolution, &shadow_ps);
+    opaque_ps.draw(manager,
+                   view,
+                   resources,
+                   resolution,
+                   &shadow_ps,
+                   transparent_ps.accumulation_ps_.is_empty());
     transparent_ps.draw(manager, view, resources, resolution);
     transparent_depth_ps.draw(manager, view, resources, resolution);
 
diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
index 7b2d340247f..1a00ef83395 100644
--- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
+++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
@@ -122,7 +122,7 @@ void OpaquePass::sync(const SceneState &scene_state, SceneResources &resources)
   deferred_ps_.bind_texture("normal_tx", &gbuffer_normal_tx);
   deferred_ps_.bind_texture("material_tx", &gbuffer_material_tx);
   deferred_ps_.bind_texture("depth_tx", &resources.depth_tx);
-  deferred_ps_.bind_texture("stencil_tx", resources.depth_tx.stencil_view());
+  deferred_ps_.bind_texture("stencil_tx", &deferred_ps_stencil_tx);
   deferred_ps_.bind_image("out_color_img", &resources.color_tx);
   resources.cavity.setup_resolve_pass(deferred_ps_, resources);
   deferred_ps_.dispatch(math::divide_ceil(scene_state.resolution, int2(WB_RESOLVE_GROUP_SIZE)));
@@ -133,7 +133,8 @@ void OpaquePass::draw(Manager &manager,
                       View &view,
                       SceneResources &resources,
                       int2 resolution,
-                      ShadowPass *shadow_pass)
+                      ShadowPass *shadow_pass,
+                      bool accumulation_ps_is_empty)
 {
   if (is_empty()) {
     return;
@@ -170,12 +171,44 @@ void OpaquePass::draw(Manager &manager,
     manager.submit(gbuffer_ps_, view);
   }
 
+  bool needs_stencil_copy = shadow_pass && !gbuffer_in_front_ps_.is_empty() &&
+                            !accumulation_ps_is_empty;
+
+  if (needs_stencil_copy) {
+    shadow_depth_stencil_tx.ensure_2d(GPU_DEPTH24_STENCIL8, resolution);
+    GPU_texture_copy(shadow_depth_stencil_tx, resources.depth_tx);
+
+    deferred_ps_stencil_tx = shadow_depth_stencil_tx.stencil_view();
+  }
+  else {
+    shadow_depth_stencil_tx.free();
+
+    deferred_ps_stencil_tx = resources.depth_tx.stencil_view();
+  }
+
+  if (shadow_pass && !gbuffer_in_front_ps_.is_empty()) {
+    opaque_fb.ensure(GPU_ATTACHMENT_TEXTURE(deferred_ps_stencil_tx));
+    opaque_fb.bind();
+    GPU_framebuffer_clear_stencil(opaque_fb, 0);
+  }
+
   if (shadow_pass) {
-    shadow_pass->draw(manager, view, resources, resolution);
+    shadow_pass->draw(manager,
+                      view,
+                      resources,
+                      resolution,
+                      *deferred_ps_stencil_tx,
+                      !gbuffer_in_front_ps_.is_empty());
   }
 
   manager.submit(deferred_ps_, view);
 
+  if (shadow_pass && !needs_stencil_copy) {
+    opaque_fb.ensure(GPU_ATTACHMENT_TEXTURE(resources.depth_tx));
+    opaque_fb.bind();
+    GPU_framebuffer_clear_stencil(opaque_fb, 0);
+  }
+
   gbuffer_normal_tx.release();
   gbuffer_material_tx.release();
 }
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index 231be03ae3e..b06666f3ad2 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -188,6 +188,9 @@ class OpaquePass {
   TextureFromPool gbuffer_material_tx = {"gbuffer_material_tx"};
   Framebuffer opaque_fb;
 
+  Texture shadow_depth_stencil_tx = {"shadow_depth_stencil_tx"};
+  GPUTexture *deferred_ps_stencil_tx = nullptr;
+
   MeshPass gbuffer_ps_ = {"Opaque.Gbuffer"};
   MeshPass gbuffer_in_front_ps_ = {"Opaque.GbufferInFront"};
   PassSimple deferred_ps_ = {"Opaque.Deferred"};
@@ -197,7 +200,8 @@ class OpaquePass {
             View &view,
             SceneResources &resources,
             int2 resolution,
-            class ShadowPass *shadow_pass);
+            class ShadowPass *shadow_pass,
+            bool accumulation_ps_is_empty);
   bool is_empty() const;
 };
 
@@ -244,6 +248,7 @@ class ShadowPass {
   enum PassType { Pass, Fail, ForcedFail, Length };
 
   class ShadowView : public View {
+    bool force_fail_method_;
     float3 light_direction_;
     UniformBuffer<ExtrudedFrustum> extruded_frustum_;
     ShadowPass::PassType current_pass_type_;
@@ -253,7 +258,7 @@ class ShadowPass {
     VisibilityBuf fail_visibility_buf_;
 
    public:
-    void setup(View &view, float3 light_direction);
+    void setup(View &view, float3 light_direction, bool force_fail_method);
     bool debug_object_culling(Object *ob);
     void set_mode(PassType type);
 
@@ -279,6 +284,7 @@ class ShadowPass {
   GPUShader *shaders_[2][2][2] = {{{nullptr}}};
   GPUShader *get_shader(bool depth_pass, bool manifold, bool cap = false);
 
+  TextureFromPool depth_tx_;
   Framebuffer fb_;
 
  public:
@@ -289,7 +295,13 @@ class ShadowPass {
                    ObjectRef &ob_ref,
                    SceneState &scene_state,
                    const bool has_transp_mat);
-  void draw(Manager &manager, View &view, SceneResources &resources, int2 resolution);
+  void draw(
+      Manager &manager,
+      View &view,
+      SceneResources &resources,
+      int2 resolution,
+      GPUTexture &depth_stencil_tx,
+      bool force_fail_method /*Needed when there are opaque "In Front" objects in the scene*/);
 };
 
 class OutlinePass {
diff --git a/source/blender/draw/engines/workbench/workbench_shadow.cc b/source/blender/draw/engines/workbench/workbench_shadow.cc
index 96d4c14c516..920f1e444e2 100644
--- a/source/blender/draw/engines/workbench/workbench_shadow.cc
+++ b/source/blender/draw/engines/workbench/workbench_shadow.cc
@@ -28,8 +28,9 @@ namespace blender::workbench {
 
 ShadowPass::ShadowView::ShadowView() : View("ShadowPass.View"){};
 
-void ShadowPass::ShadowView::setup(View &view, float3 light_direction)
+void ShadowPass::ShadowView::setup(View &view, float3 light_direction, bool force_fail_method)
 {
+  force_fail_method_ = force_fail_method;
   light_direction_ = light_direction;
   sync(view.viewmat(), view.winmat());
 
@@ -245,6 +246,7 @@ void ShadowPass::ShadowView::compute_visibility(ObjectBoundsBuf &bounds,
     GPU_shader_uniform_1i(shader, "resource_len", resource_len);
     GPU_shader_uniform_1i(shader, "view_len", view_len_);
     GPU_shader_uniform_1i(shader, "visibility_word_per_draw", word_per_draw);
+    GPU_shader_uniform_1b(shader, "force_fail_method", force_fail_method_);
     GPU_shader_uniform_3fv(shader, "shadow_direction", light_direction_);
     GPU_uniformbuf_bind(extruded_frustum_,
                         GPU_shader_get_uniform_block(shader, "extruded_frustum"));
@@ -358,9 +360,6 @@ void ShadowPass::sync()
   pass_ps_.state_set(depth_pass_state);
   pass_ps_.state_stencil(0xFF, 0xFF, 0xFF);
 
-  /* TODO(Miguel Pozo) */
-  pass_ps_.clear_stencil(0);
-
   fail_ps_.init();
   fail_ps_.state_set(depth_fail_state);
   fail_ps_.state_stencil(0xFF, 0xFF, 0xFF);
@@ -416,15 +415,10 @@ void ShadowPass::object_sync(Manager &manager,
       "%s culling : %s\n", ob->id.name, shadow_view.debug_object_culling(ob) ? "true" : "false");
 #endif
 
-  /* TODO (Miguel Pozo):
-   * Force fail pass when there are "in front" objects in the scene? */
-
   /* Shadow pass technique needs object to be have all its surface opaque. */
   /* We cannot use Shadow Pass technique on non-manifold object (see T76168). */
   bool force_fail_pass = has_transp_mat || (!is_manifold && (scene_state.cull_state != 0));
 
-  force_fail_pass = true;
-
   PassType fail_type = force_fail_pass ? ForcedFail : Fail;
 
   /* TODO(Miguel Pozo): Compute on the visibility compute shader ? */
@@ -454,17 +448,22 @@ void ShadowPass::object_sync(Manager &manager,
   }
 }
 
-void ShadowPass::draw(Manager &manager, View &view, SceneResources &resources, int2 resolution)
+void ShadowPass::draw(Manager &manager,
+                      View &view,
+           

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list