[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