[Bf-blender-cvs] [5abcd8c8fbc] tmp-workbench-rewrite2: transparency/xray mode

Miguel Pozo noreply at git.blender.org
Tue Oct 18 20:06:11 CEST 2022


Commit: 5abcd8c8fbc2d05194f3f8d375e9154f0be6c603
Author: Miguel Pozo
Date:   Tue Oct 18 20:00:50 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB5abcd8c8fbc2d05194f3f8d375e9154f0be6c603

transparency/xray mode

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

M	source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
M	source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
M	source/blender/draw/engines/workbench/workbench_engine.cc
M	source/blender/draw/engines/workbench/workbench_materials.cc
M	source/blender/draw/engines/workbench/workbench_mesh_passes.cc
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_private.hh
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/engines/workbench/shaders/infos/workbench_prepass_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
index 89dcfda3eda..5a66846a4cb 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
@@ -86,6 +86,10 @@ GPU_SHADER_CREATE_INFO(workbench_lighting_matcap)
     .sampler(4, ImageType::FLOAT_2D, "matcap_diffuse_tx", Frequency::PASS)
     .sampler(5, ImageType::FLOAT_2D, "matcap_specular_tx", Frequency::PASS);
 
+GPU_SHADER_CREATE_INFO(workbench_next_lighting_matcap)
+    .define("WORKBENCH_LIGHTING_MATCAP")
+    .sampler(WB_MATCAP_SLOT, ImageType::FLOAT_2D_ARRAY, "matcap_tx", Frequency::PASS);
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -232,7 +236,7 @@ GPU_SHADER_CREATE_INFO(workbench_matcap).define("WORKBENCH_SHADING_MATCAP");
 #define WORKBENCH_SHADING_VARIATIONS(prefix, ...) \
   WORKBENCH_COLOR_VARIATIONS(prefix##_flat, "workbench_lighting_flat", __VA_ARGS__) \
   WORKBENCH_COLOR_VARIATIONS(prefix##_studio, "workbench_lighting_studio", __VA_ARGS__) \
-  WORKBENCH_COLOR_VARIATIONS(prefix##_matcap, "workbench_lighting_matcap", __VA_ARGS__)
+  WORKBENCH_COLOR_VARIATIONS(prefix##_matcap, "workbench_next_lighting_matcap", __VA_ARGS__)
 
 #define WORKBENCH_PIPELINE_VARIATIONS(prefix, ...) \
   WORKBENCH_SHADING_VARIATIONS(prefix##_transparent, "workbench_transparent_accum", __VA_ARGS__) \
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 e3a68ec6153..40668e5a356 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
@@ -35,11 +35,12 @@ void main()
     color.rgb = base_color;
 #endif
     color.a = 1.0f;
-  }
 
-  /* TODO(fclem): Port the TAA shader that does this tranformation. */
-  /* Use log2 space to avoid highlights creating too much aliasing. */
-  color = log2(color + 0.5);
+    /* 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);
+    imageStore(out_color_img, texel, color);
+  }
 }
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
index 8b9e3f968ea..3cf9ee98aa9 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
@@ -25,7 +25,8 @@ void main()
   }
   out_color /= taaAccumulatedWeight;
   /* Exit log2 space used for Antialiasing. */
-  out_color = exp2(out_color) - 0.5;
+  /* TODO(pragma37): Re-enable */
+  // out_color = exp2(out_color) - 0.5;
 
   /* Avoid float precision issue. */
   if (out_color.a > 0.999) {
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
index beb361df4a4..d43f2ec4d3d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
@@ -44,6 +44,8 @@ float calculate_transparent_weight(void)
   return clamp(w, 1e-2, 3e2);
 }
 
+#ifdef WORKBENCH_NEXT
+
 void main()
 {
   /* Normal and Incident vector are in viewspace. Lighting is evaluated in viewspace. */
@@ -53,21 +55,59 @@ void main()
 
   vec3 color = color_interp;
 
-#ifdef WORKBENCH_COLOR_TEXTURE
+#  ifdef WORKBENCH_COLOR_TEXTURE
   color = workbench_image_color(uv_interp);
-#endif
+#  endif
+
+#  ifdef WORKBENCH_LIGHTING_MATCAP
+  vec3 shaded_color = get_matcap_lighting(matcap_tx, color, N, I);
+#  endif
+
+#  ifdef WORKBENCH_LIGHTING_STUDIO
+  vec3 shaded_color = get_world_lighting(color, _roughness, metallic, N, I);
+#  endif
+
+#  ifdef WORKBENCH_LIGHTING_FLAT
+  vec3 shaded_color = color;
+#  endif
+
+  // shaded_color *= get_shadow(N, forceShadowing);
+
+  /* Listing 4 */
+  float alpha = alpha_interp * world_data.xray_alpha;
+  float weight = calculate_transparent_weight() * alpha;
+  out_transparent_accum = vec4(shaded_color * weight, alpha);
+  out_revealage_accum = vec4(weight);
+
+  out_object_id = uint(object_id);
+}
+
+#else
 
-#ifdef WORKBENCH_LIGHTING_MATCAP
+void main()
+{
+  /* Normal and Incident vector are in viewspace. Lighting is evaluated in viewspace. */
+  vec2 uv_viewport = gl_FragCoord.xy * world_data.viewport_size_inv;
+  vec3 I = get_view_vector_from_screen_uv(uv_viewport);
+  vec3 N = normalize(normal_interp);
+
+  vec3 color = color_interp;
+
+#  ifdef WORKBENCH_COLOR_TEXTURE
+  color = workbench_image_color(uv_interp);
+#  endif
+
+#  ifdef WORKBENCH_LIGHTING_MATCAP
   vec3 shaded_color = get_matcap_lighting(matcap_diffuse_tx, matcap_specular_tx, color, N, I);
-#endif
+#  endif
 
-#ifdef WORKBENCH_LIGHTING_STUDIO
+#  ifdef WORKBENCH_LIGHTING_STUDIO
   vec3 shaded_color = get_world_lighting(color, _roughness, metallic, N, I);
-#endif
+#  endif
 
-#ifdef WORKBENCH_LIGHTING_FLAT
+#  ifdef WORKBENCH_LIGHTING_FLAT
   vec3 shaded_color = color;
-#endif
+#  endif
 
   shaded_color *= get_shadow(N, forceShadowing);
 
@@ -78,3 +118,5 @@ void main()
 
   out_object_id = uint(object_id);
 }
+
+#endif
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
index 35bea830bac..b0d082cdf97 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
@@ -16,4 +16,9 @@ void main()
   /* Listing 4 */
   fragColor.rgb = trans_accum.rgb / clamp(trans_weight, 1e-4, 5e4);
   fragColor.a = 1.0 - trans_reveal;
+
+  /* TODO(fclem): Port the TAA shader that does this tranformation. */
+  /* Use log2 space to avoid highlights creating too much aliasing. */
+  /* TODO(pragma37): Re-enable */
+  // fragColor.rgb = log2(fragColor.rgb + 0.5);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 2a2ead29a17..b32688c3092 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -36,10 +36,11 @@ class Instance {
  public:
   SceneResources resources;
 
-  OpaquePass opaque_ps;
-
-  // TransparentPass transparent_ps;
-  // TransparentPass transparent_in_front_ps;
+  OpaquePass opaque_ps = OpaquePass(resources.color_tx, resources.depth_tx);
+  OpaquePass opaque_in_front_ps = OpaquePass(resources.color_tx, resources.depth_in_front_tx);
+  TransparentPass transparent_ps = TransparentPass(resources.color_tx, resources.depth_tx);
+  TransparentPass transparent_in_front_ps = TransparentPass(resources.color_tx,
+                                                            resources.depth_in_front_tx);
 
   AntiAliasingPass anti_aliasing_ps;
 
@@ -58,6 +59,7 @@ class Instance {
   eContextObjectMode ob_mode;
 
   View3DShading shading;
+  bool xray_mode;
 
   StringRefNull current_matcap;
   Scene *scene;
@@ -123,6 +125,9 @@ class Instance {
         shading.xray_alpha = 1.0f;
       }
     }
+    world_buf.xray_alpha = shading.xray_alpha;
+
+    xray_mode = !is_render_mode && shading.xray_alpha != 1.0f;
 
     if (SHADING_XRAY_FLAG_ENABLED(shading)) {
       /* Disable shading options that aren't supported in transparency mode. */
@@ -136,8 +141,6 @@ class Instance {
     shading_type = shading_type_from_v3d_lighting(shading.light);
     material_override = Material(shading.single_color);
 
-    UniformBuffer<WorldData> &world_buf = resources.world_buf;
-
     StudioLight *studio_light = nullptr;
     if (U.edit_studio_light) {
       studio_light = BKE_studiolight_studio_edit_get();
@@ -194,6 +197,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 */
@@ -202,9 +206,13 @@ class Instance {
   void begin_sync()
   {
     resources.world_buf.push_update();
+
     opaque_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);
+    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);
+
     anti_aliasing_ps.sync(resources);
   }
 
@@ -438,13 +446,18 @@ class Instance {
             if (batches[i] == nullptr) {
               continue;
             }
-
             /* TODO(fclem): This create a cull-able instance for each sub-object. This is done
              * for simplicity to reduce complexity. But this increase the overhead per object.
              * Instead, we should use an indirection buffer to the material buffer. */
-            ::Material *mat = BKE_object_material_get_eval(ob_ref.object, i + 1);
-            if (mat == nullptr) {
-              mat = BKE_material_default_empty();
+
+            ResourceHandle handle = manager.resource_handle(ob_ref);
+            Material &mat = resources.material_buf.get_or_resize(handle.resource_index());
+
+            if (::Material *_mat = BKE_object_material_get_eval(ob_ref.object, i + 1)) {
+              mat = Material(*_mat);
+            }
+            else {
+              mat = Material(*BKE_material_default_empty());
             }
 
             ::Image *

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list