[Bf-blender-cvs] [6fd43f10d7a] tmp-workbench-rewrite2: wbench next: shadows (w.i.p.)

Miguel Pozo noreply at git.blender.org
Fri Dec 2 18:39:29 CET 2022


Commit: 6fd43f10d7a3713ea8cafd38818656fbcc31a6cf
Author: Miguel Pozo
Date:   Fri Dec 2 18:39:21 2022 +0100
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB6fd43f10d7a3713ea8cafd38818656fbcc31a6cf

wbench next: shadows (w.i.p.)

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

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_shadow_info.hh
M	source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.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
A	source/blender/draw/engines/workbench/workbench_shadow.cc
M	source/blender/draw/engines/workbench/workbench_state.cc

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 92d7d133f2f..c747e191e3e 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -176,6 +176,7 @@ set(SRC
   engines/workbench/workbench_shader.cc
   engines/workbench/workbench_shader_cache.cc
   engines/workbench/workbench_shadow.c
+  engines/workbench/workbench_shadow.cc
   engines/workbench/workbench_state.cc
   engines/workbench/workbench_transparent.c
   engines/workbench/workbench_volume.c
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 ffa1adea180..c33218cff1b 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
@@ -51,6 +51,7 @@ 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::UINT_2D, "stencil_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")
@@ -72,11 +73,11 @@ GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_flat).define("WORKBENCH_LIG
 
 GPU_SHADER_CREATE_INFO(workbench_next_resolve_curvature)
     .define("WORKBENCH_CURVATURE")
-    .sampler(6, ImageType::UINT_2D, "object_id_tx");
+    .sampler(7, 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(Miguel Pozo): GPU_SAMPLER_REPEAT is set
+    .sampler(8, ImageType::FLOAT_2D, "jitter_tx") /* TODO(Miguel Pozo): GPU_SAMPLER_REPEAT is set
                                                      in CavityEffect, it doesn't work here ? */
     .uniform_buf(5, "float4", "cavity_samples[512]");
 
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 c66e4d61233..a77af467ec8 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
@@ -19,6 +19,16 @@ GPU_SHADER_CREATE_INFO(workbench_shadow_common)
     .vertex_source("workbench_shadow_vert.glsl")
     .additional_info("draw_mesh");
 
+GPU_SHADER_CREATE_INFO(workbench_next_shadow_common)
+    .vertex_in(0, Type::VEC3, "pos")
+    .vertex_out(workbench_shadow_iface)
+    .push_constant(Type::FLOAT, "lightDistance")
+    .push_constant(Type::VEC3, "lightDirection")
+    .vertex_source("workbench_shadow_vert.glsl")
+    .additional_info("draw_view")
+    .additional_info("draw_modelmat_new")
+    .additional_info("draw_resource_handle_new");
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -58,42 +68,64 @@ GPU_SHADER_CREATE_INFO(workbench_shadow_debug)
     .fragment_out(2, Type::UINT, "objectId")
     .fragment_source("workbench_shadow_debug_frag.glsl");
 
+GPU_SHADER_CREATE_INFO(workbench_next_shadow_no_debug)
+    .additional_info("workbench_shadow_no_debug");
+
+GPU_SHADER_CREATE_INFO(workbench_next_shadow_debug).additional_info("workbench_shadow_debug");
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
 /** \name Variations Declaration
  * \{ */
 
-#define WORKBENCH_SHADOW_VARIATIONS(suffix, ...) \
-  GPU_SHADER_CREATE_INFO(workbench_shadow_pass_manifold_no_caps##suffix) \
+#define WORKBENCH_SHADOW_VARIATIONS(common, prefix, suffix, ...) \
+  GPU_SHADER_CREATE_INFO(prefix##_pass_manifold_no_caps##suffix) \
       .define("SHADOW_PASS") \
-      .additional_info("workbench_shadow_common", "workbench_shadow_manifold", __VA_ARGS__) \
+      .additional_info(common, "workbench_shadow_manifold", __VA_ARGS__) \
       .do_static_compilation(true); \
-  GPU_SHADER_CREATE_INFO(workbench_shadow_pass_no_manifold_no_caps##suffix) \
+  GPU_SHADER_CREATE_INFO(prefix##_pass_no_manifold_no_caps##suffix) \
       .define("SHADOW_PASS") \
       .define("DOUBLE_MANIFOLD") \
-      .additional_info("workbench_shadow_common", "workbench_shadow_no_manifold", __VA_ARGS__) \
+      .additional_info(common, "workbench_shadow_no_manifold", __VA_ARGS__) \
       .do_static_compilation(true); \
-  GPU_SHADER_CREATE_INFO(workbench_shadow_fail_manifold_caps##suffix) \
+  GPU_SHADER_CREATE_INFO(prefix##_fail_manifold_caps##suffix) \
       .define("SHADOW_FAIL") \
-      .additional_info("workbench_shadow_common", "workbench_shadow_caps", __VA_ARGS__) \
+      .additional_info(common, "workbench_shadow_caps", __VA_ARGS__) \
       .do_static_compilation(true); \
-  GPU_SHADER_CREATE_INFO(workbench_shadow_fail_manifold_no_caps##suffix) \
+  GPU_SHADER_CREATE_INFO(prefix##_fail_manifold_no_caps##suffix) \
       .define("SHADOW_FAIL") \
-      .additional_info("workbench_shadow_common", "workbench_shadow_manifold", __VA_ARGS__) \
+      .additional_info(common, "workbench_shadow_manifold", __VA_ARGS__) \
       .do_static_compilation(true); \
-  GPU_SHADER_CREATE_INFO(workbench_shadow_fail_no_manifold_caps##suffix) \
+  GPU_SHADER_CREATE_INFO(prefix##_fail_no_manifold_caps##suffix) \
       .define("SHADOW_FAIL") \
       .define("DOUBLE_MANIFOLD") \
-      .additional_info("workbench_shadow_common", "workbench_shadow_caps", __VA_ARGS__) \
+      .additional_info(common, "workbench_shadow_caps", __VA_ARGS__) \
       .do_static_compilation(true); \
-  GPU_SHADER_CREATE_INFO(workbench_shadow_fail_no_manifold_no_caps##suffix) \
+  GPU_SHADER_CREATE_INFO(prefix##_fail_no_manifold_no_caps##suffix) \
       .define("SHADOW_FAIL") \
       .define("DOUBLE_MANIFOLD") \
-      .additional_info("workbench_shadow_common", "workbench_shadow_no_manifold", __VA_ARGS__) \
+      .additional_info(common, "workbench_shadow_no_manifold", __VA_ARGS__) \
       .do_static_compilation(true);
 
-WORKBENCH_SHADOW_VARIATIONS(, "workbench_shadow_no_debug")
-WORKBENCH_SHADOW_VARIATIONS(_debug, "workbench_shadow_debug")
+WORKBENCH_SHADOW_VARIATIONS("workbench_shadow_common",
+                            workbench_shadow,
+                            ,
+                            "workbench_shadow_no_debug")
+
+WORKBENCH_SHADOW_VARIATIONS("workbench_shadow_common",
+                            workbench_shadow,
+                            _debug,
+                            "workbench_shadow_debug")
+
+WORKBENCH_SHADOW_VARIATIONS("workbench_next_shadow_common",
+                            workbench_next_shadow,
+                            ,
+                            "workbench_next_shadow_no_debug")
+
+WORKBENCH_SHADOW_VARIATIONS("workbench_next_shadow_common",
+                            workbench_next_shadow,
+                            _debug,
+                            "workbench_next_shadow_debug")
 
 /** \} */
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 c18d4ba843d..0ca96cc6149 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
@@ -58,6 +58,9 @@ void main()
 
 #endif
 
+    bool shadow = texture(stencil_tx, uv).r != 0;
+    color.rgb *= get_shadow(N, shadow);
+
     color.a = 1.0f;
   }
 
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 791da284503..ca5bd33bcef 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
@@ -72,7 +72,7 @@ void main()
   vec3 shaded_color = color;
 #  endif
 
-  // shaded_color *= get_shadow(N, forceShadowing);
+  shaded_color *= get_shadow(N, forceShadowing);
 
   /* Listing 4 */
   float alpha = alpha_interp * world_data.xray_alpha;
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 483664b3f66..bb71816b07c 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -31,6 +31,7 @@ class Instance {
   TransparentPass transparent_ps;
   TransparentDepthPass transparent_depth_ps;
 
+  ShadowPass shadow_ps;
   OutlinePass outline_ps;
   DofPass dof_ps;
   AntiAliasingPass anti_aliasing_ps;
@@ -38,6 +39,7 @@ class Instance {
   void init(Object *camera_ob = nullptr)
   {
     scene_state.init(camera_ob);
+    shadow_ps.init(scene_state, resources);
     resources.init(scene_state);
 
     outline_ps.init(scene_state);
@@ -47,10 +49,15 @@ class Instance {
 
   void begin_sync()
   {
+    const float2 viewport_size = DRW_viewport_size_get();
+    const int2 resolution = {int(viewport_size.x), int(viewport_size.y)};
+    resources.depth_tx.ensure_2d(GPU_DEPTH24_STENCIL8, resolution);
+
     opaque_ps.sync(scene_state, resources);
     transparent_ps.sync(scene_state, resources);
     transparent_depth_ps.sync(scene_state, resources);
 
+    shadow_ps.sync();
     outline_ps.sync(resources);
     dof_ps.sync(resources);
     anti_aliasing_ps.sync(resources, scene_state.resolution);
@@ -149,6 +156,8 @@ class Instance {
 
   void mesh_sync(Manager &manager, ObjectRef &ob_ref, const ObjectState &object_state)
   {
+    bool has_transparent_material = false;
+
     if (object_state.sculpt_pbvh) {
       /* TODO(Miguel Pozo):
       workbench_cache_sculpt_populate(wpd, ob, object_state.color_type);
@@ -186,6 +195,8 @@ class Instance {
               mat = Material(*BKE_material_default_empty());
             }
 
+            has_transparent_material = has_transparent_material || mat.is_transparent();
+
             ::Image *image = nullptr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list