[Bf-blender-cvs] [ef836b2222f] tmp-workbench-rewrite2: OpaquePass in_front support

Miguel Pozo noreply at git.blender.org
Fri Oct 14 12:24:55 CEST 2022


Commit: ef836b2222f25a87bdc4b12140e810bcf0004fef
Author: Miguel Pozo
Date:   Fri Oct 14 12:24:01 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rBef836b2222f25a87bdc4b12140e810bcf0004fef

OpaquePass in_front support

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

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/workbench_composite_comp.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
index 5297559aa60..837f0628fbc 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
@@ -13,14 +13,9 @@ 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;
-
-  /* TODO(fclem): Merge in_front depth with main depth here instead of a separate shader. */
+  depth = min(depth, texture(depth_in_front_tx, uv).r);
 
   vec3 base_color = mat_data.rgb;
-
-  float roughness, metallic;
-  workbench_float_pair_decode(mat_data.a, roughness, metallic);
-
   vec4 color = world_data.background_color;
 
   /* Background pixels. */
@@ -28,11 +23,12 @@ void main()
 #ifdef WORKBENCH_LIGHTING_MATCAP
     /* When using matcaps, mat_data.a is the back-face sign. */
     N = (mat_data.a > 0.0) ? N : -N;
-
     color.rgb = get_matcap_lighting(matcap_tx, base_color, N, V);
 #endif
 
 #ifdef WORKBENCH_LIGHTING_STUDIO
+    float roughness, metallic;
+    workbench_float_pair_decode(mat_data.a, roughness, metallic);
     color.rgb = get_world_lighting(base_color, roughness, metallic, N, V);
 #endif
 
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 63ea53531ff..ad00f91a415 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -37,7 +37,6 @@ class Instance {
   SceneResources resources;
 
   OpaquePass opaque_ps;
-  // OpaquePass opaque_in_front_ps;
 
   // TransparentPass transparent_ps;
   // TransparentPass transparent_in_front_ps;
@@ -183,6 +182,7 @@ 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 */
@@ -192,9 +192,8 @@ class Instance {
   {
     resources.world_buf.push_update();
     opaque_ps.sync(cull_state, clip_state, shading_type, resources);
-    // opaque_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
-    // transparent_ps.sync(cull_state, clip_state, shading_type, resources);
-    // transparent_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
+    //  transparent_ps.sync(cull_state, clip_state, shading_type, resources);
+    //  transparent_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
     anti_aliasing_ps.sync(resources);
   }
 
@@ -505,21 +504,22 @@ class Instance {
                               eGPUSamplerState sampler_state = GPU_SAMPLER_DEFAULT,
                               ImageUser *iuser = nullptr)
   {
-    return opaque_ps.gbuffer_ps_.sub_pass_get(ob_ref, image, sampler_state, iuser);
+    const bool in_front = (ob_ref.object->dtx & OB_DRAW_IN_FRONT) != 0;
+    if (in_front) {
+      return opaque_ps.gbuffer_in_front_ps_.sub_pass_get(ob_ref, image, sampler_state, iuser);
+    }
+    else {
+      return opaque_ps.gbuffer_ps_.sub_pass_get(ob_ref, image, sampler_state, iuser);
+    }
   }
 
   void draw(Manager &manager, View &view, GPUTexture *depth_tx, GPUTexture *color_tx)
   {
     resources.color_tx.acquire(int2(resources.depth_tx.size()), GPU_RGBA16F);
 
-    opaque_ps.draw_prepass(manager, view, resources.depth_tx);
-    // volume_ps.draw_prepass(manager, view, resources.depth_tx);
+    opaque_ps.draw_prepass(manager, view, resources.depth_tx, resources.depth_in_front_tx);
     // transparent_ps.draw_prepass(manager, view, resources.depth_tx);
-
-    // if (opaque_in_front_ps.is_empty() == false || transparent_in_front_ps.is_empty() == false) {
-    //   opaque_in_front_ps.draw_prepass(manager, view, resources.depth_in_front_tx);
-    //   transparent_in_front_ps.draw_prepass(manager, view, resources.depth_in_front_tx);
-    // }
+    // volume_ps.draw_prepass(manager, view, resources.depth_tx);
 
     opaque_ps.draw_resolve(manager, view);
     // transparent_ps.draw_resolve(manager, view);
diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
index 722bac97ab3..23fa3bd7f5e 100644
--- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
+++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
@@ -97,6 +97,7 @@ void OpaquePass::sync(DRWState cull_state,
                    cull_state | clip_state;
 
   gbuffer_ps_.init(ePipelineType::OPAQUE, shading_type, resources, state);
+  gbuffer_in_front_ps_.init(ePipelineType::OPAQUE, shading_type, resources, state);
 
   deferred_ps_.init();
   deferred_ps_.shader_set(shaders.resolve_shader_get(ePipelineType::OPAQUE, shading_type));
@@ -105,12 +106,16 @@ 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)
+void OpaquePass::draw_prepass(Manager &manager,
+                              View &view,
+                              Texture &depth_tx,
+                              Texture &depth_in_front_tx)
 {
   gbuffer_material_tx.acquire(int2(depth_tx.size()), GPU_RGBA16F);
   gbuffer_normal_tx.acquire(int2(depth_tx.size()), GPU_RG16F);
@@ -122,8 +127,18 @@ void OpaquePass::draw_prepass(Manager &manager, View &view, Texture &depth_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);
+  }
 }
 
 void OpaquePass::draw_resolve(Manager &manager, View &view)
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index ba5f1bec425..07624ccdc19 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -95,6 +95,7 @@ class OpaquePass {
   Framebuffer opaque_fb;
 
   MeshPass gbuffer_ps_ = {"Opaque.Gbuffer"};
+  MeshPass gbuffer_in_front_ps_ = {"Opaque.GbufferInFront"};
   PassSimple deferred_ps_ = {"Opaque.Deferred"};
 
   void sync(DRWState cull_state,
@@ -102,7 +103,7 @@ class OpaquePass {
             eShadingType shading_type,
             SceneResources &resources);
 
-  void draw_prepass(Manager &manager, View &view, Texture &depth_tx);
+  void draw_prepass(Manager &manager, View &view, Texture &depth_tx, Texture &depth_in_front_tx);
 
   void draw_resolve(Manager &manager, View &view);



More information about the Bf-blender-cvs mailing list