[Bf-blender-cvs] [695ce56e06e] tmp-workbench-rewrite2: Use stencil buffer for Opaque In Front

Miguel Pozo noreply at git.blender.org
Fri Oct 14 16:24:49 CEST 2022


Commit: 695ce56e06e299ea51f1bbbf6ed005b566d33e75
Author: Miguel Pozo
Date:   Fri Oct 14 16:24:25 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB695ce56e06e299ea51f1bbbf6ed005b566d33e75

Use stencil buffer for Opaque In Front

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

M	source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
M	source/blender/draw/engines/workbench/shaders/workbench_composite_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

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

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 f2e996a1f0f..5b8fee31f45 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
@@ -22,7 +22,6 @@ GPU_SHADER_CREATE_INFO(workbench_next_composite)
     .sampler(3, ImageType::FLOAT_2D, "normal_tx")
     .sampler(4, ImageType::FLOAT_2D, "material_tx")
     .sampler(5, ImageType::DEPTH_2D, "depth_tx")
-    .sampler(6, ImageType::DEPTH_2D, "depth_in_front_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")
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 837f0628fbc..cdd8a4429bf 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
@@ -13,7 +13,6 @@ void main()
   vec3 N = workbench_normal_decode(texture(normal_tx, uv));
   vec4 mat_data = texture(material_tx, uv);
   float depth = texture(depth_tx, uv).r;
-  depth = min(depth, texture(depth_in_front_tx, uv).r);
 
   vec3 base_color = mat_data.rgb;
   vec4 color = world_data.background_color;
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index ad00f91a415..0de83b2c560 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -182,7 +182,6 @@ class Instance {
     /* TODO(pragma37) volumes_do */
 
     resources.depth_tx.ensure_2d(GPU_DEPTH24_STENCIL8, output_res);
-    resources.depth_in_front_tx.ensure_2d(GPU_DEPTH24_STENCIL8, output_res);
 
     anti_aliasing_ps.init(reset_taa);
     /* TODO(pragma37) taa_sample_len */
@@ -517,7 +516,7 @@ class Instance {
   {
     resources.color_tx.acquire(int2(resources.depth_tx.size()), GPU_RGBA16F);
 
-    opaque_ps.draw_prepass(manager, view, resources.depth_tx, resources.depth_in_front_tx);
+    opaque_ps.draw_prepass(manager, view, resources.depth_tx);
     // transparent_ps.draw_prepass(manager, view, resources.depth_tx);
     // volume_ps.draw_prepass(manager, view, resources.depth_tx);
 
diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
index 23fa3bd7f5e..53901ccc783 100644
--- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
+++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
@@ -12,19 +12,17 @@ bool MeshPass::is_empty() const
   return false; /* TODO */
 }
 
-void MeshPass::init(ePipelineType pipeline,
-                    eShadingType shading,
-                    SceneResources &resources,
-                    DRWState state)
+void MeshPass::init_pass(SceneResources &resources, DRWState state)
 {
-  ShaderCache &shaders = resources.shader_cache;
-
   this->PassMain::init();
   this->state_set(state);
   this->bind_texture(WB_MATCAP_SLOT, resources.matcap_tx);
   this->bind_ssbo(WB_MATERIAL_SLOT, &resources.material_buf);
   this->bind_ubo(WB_WORLD_SLOT, resources.world_buf);
+}
 
+void MeshPass::init_subpasses(ePipelineType pipeline, eShadingType shading, ShaderCache &shaders)
+{
   texture_subpass_map.clear();
 
   for (auto geom : IndexRange(geometry_type_len)) {
@@ -90,14 +88,21 @@ void OpaquePass::sync(DRWState cull_state,
                       SceneResources &resources)
 {
   Texture &depth_tx = resources.depth_tx;
-  Texture &depth_in_front_tx = resources.depth_in_front_tx;
   TextureFromPool &color_tx = resources.color_tx;
   ShaderCache &shaders = resources.shader_cache;
   DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
                    cull_state | clip_state;
 
-  gbuffer_ps_.init(ePipelineType::OPAQUE, shading_type, resources, state);
-  gbuffer_in_front_ps_.init(ePipelineType::OPAQUE, shading_type, resources, state);
+  DRWState in_front_state = state | DRW_STATE_WRITE_STENCIL | DRW_STATE_STENCIL_ALWAYS;
+  gbuffer_in_front_ps_.init_pass(resources, in_front_state);
+  gbuffer_in_front_ps_.clear_depth_stencil(1.0, 0x00);
+  gbuffer_in_front_ps_.state_stencil(0xFF, 0xFF, 0x00);
+  gbuffer_in_front_ps_.init_subpasses(ePipelineType::OPAQUE, shading_type, resources.shader_cache);
+
+  state |= DRW_STATE_STENCIL_NEQUAL;
+  gbuffer_ps_.init_pass(resources, state);
+  gbuffer_ps_.state_stencil(0x00, 0xFF, 0xFF);
+  gbuffer_ps_.init_subpasses(ePipelineType::OPAQUE, shading_type, resources.shader_cache);
 
   deferred_ps_.init();
   deferred_ps_.shader_set(shaders.resolve_shader_get(ePipelineType::OPAQUE, shading_type));
@@ -106,16 +111,12 @@ void OpaquePass::sync(DRWState cull_state,
   deferred_ps_.bind_texture("normal_tx", &gbuffer_normal_tx);
   deferred_ps_.bind_texture("material_tx", &gbuffer_material_tx);
   deferred_ps_.bind_texture("depth_tx", &depth_tx);
-  deferred_ps_.bind_texture("depth_in_front_tx", &depth_in_front_tx);
   deferred_ps_.bind_image("out_color_img", &color_tx);
   deferred_ps_.dispatch(math::divide_ceil(int2(depth_tx.size()), int2(WB_RESOLVE_GROUP_SIZE)));
   deferred_ps_.barrier(GPU_BARRIER_TEXTURE_FETCH);
 }
 
-void OpaquePass::draw_prepass(Manager &manager,
-                              View &view,
-                              Texture &depth_tx,
-                              Texture &depth_in_front_tx)
+void OpaquePass::draw_prepass(Manager &manager, View &view, Texture &depth_tx)
 {
   gbuffer_material_tx.acquire(int2(depth_tx.size()), GPU_RGBA16F);
   gbuffer_normal_tx.acquire(int2(depth_tx.size()), GPU_RG16F);
@@ -126,19 +127,9 @@ void OpaquePass::draw_prepass(Manager &manager,
                    GPU_ATTACHMENT_TEXTURE(gbuffer_normal_tx),
                    GPU_ATTACHMENT_TEXTURE(gbuffer_object_id_tx));
   opaque_fb.bind();
-  opaque_fb.clear_depth(1.0f);
-  manager.submit(gbuffer_ps_, view);
 
-  /* TODO(pragma37): render in front first and setup stencil testing */
-  if (!gbuffer_in_front_ps_.is_empty()) {
-    opaque_fb.ensure(GPU_ATTACHMENT_TEXTURE(depth_in_front_tx),
-                     GPU_ATTACHMENT_TEXTURE(gbuffer_material_tx),
-                     GPU_ATTACHMENT_TEXTURE(gbuffer_normal_tx),
-                     GPU_ATTACHMENT_TEXTURE(gbuffer_object_id_tx));
-    opaque_fb.bind();
-    opaque_fb.clear_depth(1.0f);
-    manager.submit(gbuffer_in_front_ps_, view);
-  }
+  manager.submit(gbuffer_in_front_ps_, view);
+  manager.submit(gbuffer_ps_, view);
 }
 
 void OpaquePass::draw_resolve(Manager &manager, View &view)
@@ -165,7 +156,9 @@ void TransparentPass::sync(DRWState cull_state,
   DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
                    cull_state | clip_state;
 
-  accumulation_ps_.init(ePipelineType::TRANSPARENT, shading_type, resources, state);
+  accumulation_ps_.init_pass(resources, state);
+  accumulation_ps_.init_subpasses(
+      ePipelineType::TRANSPARENT, shading_type, resources.shader_cache);
 
   resolve_ps_.init();
   resolve_ps_.shader_set(
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index 07624ccdc19..db9523a1a71 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -75,10 +75,9 @@ class MeshPass : public PassMain {
   /* Move to draw::Pass */
   bool is_empty() const;
 
-  void init(ePipelineType pipeline,
-            eShadingType shading,
-            SceneResources &resources,
-            DRWState state);
+  void init_pass(SceneResources &resources, DRWState state);
+
+  void init_subpasses(ePipelineType pipeline, eShadingType shading, ShaderCache &shaders);
 
   PassMain::Sub &sub_pass_get(
       ObjectRef &ref,
@@ -103,7 +102,7 @@ class OpaquePass {
             eShadingType shading_type,
             SceneResources &resources);
 
-  void draw_prepass(Manager &manager, View &view, Texture &depth_tx, Texture &depth_in_front_tx);
+  void draw_prepass(Manager &manager, View &view, Texture &depth_tx);
 
   void draw_resolve(Manager &manager, View &view);



More information about the Bf-blender-cvs mailing list