[Bf-blender-cvs] [7bc00aeabf2] tmp-wbench-next-shadow-backup: Workbench Next: Shadows: In front integration
Miguel Pozo
noreply at git.blender.org
Mon Dec 19 13:11:59 CET 2022
Commit: 7bc00aeabf24ae6b8b2a5d99133f9178be953529
Author: Miguel Pozo
Date: Fri Dec 16 17:29:36 2022 +0100
Branches: tmp-wbench-next-shadow-backup
https://developer.blender.org/rB7bc00aeabf24ae6b8b2a5d99133f9178be953529
Workbench Next: Shadows: In front integration
===================================================================
M source/blender/draw/engines/workbench/shaders/infos/workbench_shadow_info.hh
M source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_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
M source/blender/draw/engines/workbench/workbench_shadow.cc
===================================================================
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 ecccb2083b1..04fd4349d65 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
@@ -38,10 +38,10 @@ GPU_SHADER_CREATE_INFO(workbench_next_shadow_visibility_compute_common)
.define("DRW_VIEW_LEN", "64")
.storage_buf(0, Qualifier::READ, "ObjectBounds", "bounds_buf[]")
.uniform_buf(2, "ExtrudedFrustum", "extruded_frustum")
- .push_constant(Type::BOOL, "forced_fail_pass")
.push_constant(Type::INT, "resource_len")
.push_constant(Type::INT, "view_len")
.push_constant(Type::INT, "visibility_word_per_draw")
+ .push_constant(Type::BOOL, "force_fail_method")
.push_constant(Type::VEC3, "shadow_direction")
.typedef_source("workbench_shader_shared.h")
.compute_source("workbench_shadow_visibility_comp.glsl")
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl
index ddf655ec006..e638e68c80f 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_visibility_comp.glsl
@@ -86,7 +86,7 @@ void main()
#ifdef DYNAMIC_PASS_SELECTION
if (is_visible(box)) {
- bool use_fail_pass = intersects_near_plane(box);
+ bool use_fail_pass = force_fail_method || intersects_near_plane(box);
set_visibility(!use_fail_pass, use_fail_pass);
}
else {
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 8805657acfd..9c7bfb7c6c3 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -336,7 +336,12 @@ class Instance {
}
}
- opaque_ps.draw(manager, view, resources, resolution, &shadow_ps);
+ opaque_ps.draw(manager,
+ view,
+ resources,
+ resolution,
+ &shadow_ps,
+ transparent_ps.accumulation_ps_.is_empty());
transparent_ps.draw(manager, view, resources, resolution);
transparent_depth_ps.draw(manager, view, resources, resolution);
diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
index 7b2d340247f..1a00ef83395 100644
--- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
+++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
@@ -122,7 +122,7 @@ void OpaquePass::sync(const SceneState &scene_state, SceneResources &resources)
deferred_ps_.bind_texture("normal_tx", &gbuffer_normal_tx);
deferred_ps_.bind_texture("material_tx", &gbuffer_material_tx);
deferred_ps_.bind_texture("depth_tx", &resources.depth_tx);
- deferred_ps_.bind_texture("stencil_tx", resources.depth_tx.stencil_view());
+ deferred_ps_.bind_texture("stencil_tx", &deferred_ps_stencil_tx);
deferred_ps_.bind_image("out_color_img", &resources.color_tx);
resources.cavity.setup_resolve_pass(deferred_ps_, resources);
deferred_ps_.dispatch(math::divide_ceil(scene_state.resolution, int2(WB_RESOLVE_GROUP_SIZE)));
@@ -133,7 +133,8 @@ void OpaquePass::draw(Manager &manager,
View &view,
SceneResources &resources,
int2 resolution,
- ShadowPass *shadow_pass)
+ ShadowPass *shadow_pass,
+ bool accumulation_ps_is_empty)
{
if (is_empty()) {
return;
@@ -170,12 +171,44 @@ void OpaquePass::draw(Manager &manager,
manager.submit(gbuffer_ps_, view);
}
+ bool needs_stencil_copy = shadow_pass && !gbuffer_in_front_ps_.is_empty() &&
+ !accumulation_ps_is_empty;
+
+ if (needs_stencil_copy) {
+ shadow_depth_stencil_tx.ensure_2d(GPU_DEPTH24_STENCIL8, resolution);
+ GPU_texture_copy(shadow_depth_stencil_tx, resources.depth_tx);
+
+ deferred_ps_stencil_tx = shadow_depth_stencil_tx.stencil_view();
+ }
+ else {
+ shadow_depth_stencil_tx.free();
+
+ deferred_ps_stencil_tx = resources.depth_tx.stencil_view();
+ }
+
+ if (shadow_pass && !gbuffer_in_front_ps_.is_empty()) {
+ opaque_fb.ensure(GPU_ATTACHMENT_TEXTURE(deferred_ps_stencil_tx));
+ opaque_fb.bind();
+ GPU_framebuffer_clear_stencil(opaque_fb, 0);
+ }
+
if (shadow_pass) {
- shadow_pass->draw(manager, view, resources, resolution);
+ shadow_pass->draw(manager,
+ view,
+ resources,
+ resolution,
+ *deferred_ps_stencil_tx,
+ !gbuffer_in_front_ps_.is_empty());
}
manager.submit(deferred_ps_, view);
+ if (shadow_pass && !needs_stencil_copy) {
+ opaque_fb.ensure(GPU_ATTACHMENT_TEXTURE(resources.depth_tx));
+ opaque_fb.bind();
+ GPU_framebuffer_clear_stencil(opaque_fb, 0);
+ }
+
gbuffer_normal_tx.release();
gbuffer_material_tx.release();
}
diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index 231be03ae3e..b06666f3ad2 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -188,6 +188,9 @@ class OpaquePass {
TextureFromPool gbuffer_material_tx = {"gbuffer_material_tx"};
Framebuffer opaque_fb;
+ Texture shadow_depth_stencil_tx = {"shadow_depth_stencil_tx"};
+ GPUTexture *deferred_ps_stencil_tx = nullptr;
+
MeshPass gbuffer_ps_ = {"Opaque.Gbuffer"};
MeshPass gbuffer_in_front_ps_ = {"Opaque.GbufferInFront"};
PassSimple deferred_ps_ = {"Opaque.Deferred"};
@@ -197,7 +200,8 @@ class OpaquePass {
View &view,
SceneResources &resources,
int2 resolution,
- class ShadowPass *shadow_pass);
+ class ShadowPass *shadow_pass,
+ bool accumulation_ps_is_empty);
bool is_empty() const;
};
@@ -244,6 +248,7 @@ class ShadowPass {
enum PassType { Pass, Fail, ForcedFail, Length };
class ShadowView : public View {
+ bool force_fail_method_;
float3 light_direction_;
UniformBuffer<ExtrudedFrustum> extruded_frustum_;
ShadowPass::PassType current_pass_type_;
@@ -253,7 +258,7 @@ class ShadowPass {
VisibilityBuf fail_visibility_buf_;
public:
- void setup(View &view, float3 light_direction);
+ void setup(View &view, float3 light_direction, bool force_fail_method);
bool debug_object_culling(Object *ob);
void set_mode(PassType type);
@@ -279,6 +284,7 @@ class ShadowPass {
GPUShader *shaders_[2][2][2] = {{{nullptr}}};
GPUShader *get_shader(bool depth_pass, bool manifold, bool cap = false);
+ TextureFromPool depth_tx_;
Framebuffer fb_;
public:
@@ -289,7 +295,13 @@ class ShadowPass {
ObjectRef &ob_ref,
SceneState &scene_state,
const bool has_transp_mat);
- void draw(Manager &manager, View &view, SceneResources &resources, int2 resolution);
+ void draw(
+ Manager &manager,
+ View &view,
+ SceneResources &resources,
+ int2 resolution,
+ GPUTexture &depth_stencil_tx,
+ bool force_fail_method /*Needed when there are opaque "In Front" objects in the scene*/);
};
class OutlinePass {
diff --git a/source/blender/draw/engines/workbench/workbench_shadow.cc b/source/blender/draw/engines/workbench/workbench_shadow.cc
index 96d4c14c516..920f1e444e2 100644
--- a/source/blender/draw/engines/workbench/workbench_shadow.cc
+++ b/source/blender/draw/engines/workbench/workbench_shadow.cc
@@ -28,8 +28,9 @@ namespace blender::workbench {
ShadowPass::ShadowView::ShadowView() : View("ShadowPass.View"){};
-void ShadowPass::ShadowView::setup(View &view, float3 light_direction)
+void ShadowPass::ShadowView::setup(View &view, float3 light_direction, bool force_fail_method)
{
+ force_fail_method_ = force_fail_method;
light_direction_ = light_direction;
sync(view.viewmat(), view.winmat());
@@ -245,6 +246,7 @@ void ShadowPass::ShadowView::compute_visibility(ObjectBoundsBuf &bounds,
GPU_shader_uniform_1i(shader, "resource_len", resource_len);
GPU_shader_uniform_1i(shader, "view_len", view_len_);
GPU_shader_uniform_1i(shader, "visibility_word_per_draw", word_per_draw);
+ GPU_shader_uniform_1b(shader, "force_fail_method", force_fail_method_);
GPU_shader_uniform_3fv(shader, "shadow_direction", light_direction_);
GPU_uniformbuf_bind(extruded_frustum_,
GPU_shader_get_uniform_block(shader, "extruded_frustum"));
@@ -358,9 +360,6 @@ void ShadowPass::sync()
pass_ps_.state_set(depth_pass_state);
pass_ps_.state_stencil(0xFF, 0xFF, 0xFF);
- /* TODO(Miguel Pozo) */
- pass_ps_.clear_stencil(0);
-
fail_ps_.init();
fail_ps_.state_set(depth_fail_state);
fail_ps_.state_stencil(0xFF, 0xFF, 0xFF);
@@ -416,15 +415,10 @@ void ShadowPass::object_sync(Manager &manager,
"%s culling : %s\n", ob->id.name, shadow_view.debug_object_culling(ob) ? "true" : "false");
#endif
- /* TODO (Miguel Pozo):
- * Force fail pass when there are "in front" objects in the scene? */
-
/* Shadow pass technique needs object to be have all its surface opaque. */
/* We cannot use Shadow Pass technique on non-manifold object (see T76168). */
bool force_fail_pass = has_transp_mat || (!is_manifold && (scene_state.cull_state != 0));
- force_fail_pass = true;
-
PassType fail_type = force_fail_pass ? ForcedFail : Fail;
/* TODO(Miguel Pozo): Compute on the visibility compute shader ? */
@@ -454,17 +448,22 @@ void ShadowPass::object_sync(Manager &manager,
}
}
-void ShadowPass::draw(Manager &manager, View &view, SceneResources &resources, int2 resolution)
+void ShadowPass::draw(Manager &manager,
+ View &view,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list