From 2bbf65f6e5ef606a826cf839d6cfe8487620a1ee Mon Sep 17 00:00:00 2001 From: Miguel Pozo Date: Thu, 11 Jan 2024 16:35:44 +0100 Subject: [PATCH] Fix #116985: Workbench: Skip volume depth test in Wireframe mode --- .../workbench/shaders/infos/workbench_volume_info.hh | 1 + .../engines/workbench/shaders/workbench_volume_frag.glsl | 6 +++--- source/blender/draw/engines/workbench/workbench_volume.cc | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_volume_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_volume_info.hh index 082fa2b67f5..bf367c9828b 100644 --- a/source/blender/draw/engines/workbench/shaders/infos/workbench_volume_info.hh +++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_volume_info.hh @@ -17,6 +17,7 @@ GPU_SHADER_CREATE_INFO(workbench_volume_common) .push_constant(Type::FLOAT, "noiseOfs") .push_constant(Type::FLOAT, "stepLength") .push_constant(Type::FLOAT, "densityScale") + .push_constant(Type::BOOL, "do_depth_test") .vertex_source("workbench_volume_vert.glsl") .fragment_source("workbench_volume_frag.glsl"); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl index ed1894873c8..32c653d9205 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl @@ -227,7 +227,7 @@ void main() { uint stencil = texelFetch(stencil_tx, ivec2(gl_FragCoord.xy), 0).r; const uint in_front_stencil_bits = 1u << 1; - if ((stencil & in_front_stencil_bits) != 0) { + if (do_depth_test && (stencil & in_front_stencil_bits) != 0) { /* Don't draw on top of "in front" objects. */ discard; return; @@ -236,7 +236,7 @@ void main() #ifdef VOLUME_SLICE /* Manual depth test. TODO: remove. */ float depth = texelFetch(depthBuffer, ivec2(gl_FragCoord.xy), 0).r; - if (gl_FragCoord.z >= depth) { + if (do_depth_test && gl_FragCoord.z >= depth) { /* NOTE: In the Metal API, prior to Metal 2.3, Discard is not an explicit return and can * produce undefined behavior. This is especially prominent with derivatives if control-flow * divergence is present. @@ -260,7 +260,7 @@ void main() vec3 volume_center = ModelMatrix[3].xyz; - float depth = texelFetch(depthBuffer, ivec2(gl_FragCoord.xy), 0).r; + float depth = do_depth_test ? texelFetch(depthBuffer, ivec2(gl_FragCoord.xy), 0).r : 1.0; float depth_end = min(depth, gl_FragCoord.z); vec3 vs_ray_end = get_view_space_from_depth(screen_uv, depth_end); vec3 vs_ray_ori = get_view_space_from_depth(screen_uv, 0.0); diff --git a/source/blender/draw/engines/workbench/workbench_volume.cc b/source/blender/draw/engines/workbench/workbench_volume.cc index 01944449c2b..5b66fdeb203 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.cc +++ b/source/blender/draw/engines/workbench/workbench_volume.cc @@ -62,6 +62,7 @@ void VolumePass::object_sync_volume(Manager &manager, const bool use_slice = (volume->display.axis_slice_method == AXIS_SLICE_SINGLE); sub_ps.shader_set(get_shader(use_slice, false, volume->display.interpolation_method, false)); + sub_ps.push_constant("do_depth_test", scene_state.shading.type >= OB_SOLID); const float density_scale = volume->display.density * BKE_volume_density_scale(volume, ob->object_to_world); @@ -128,6 +129,7 @@ void VolumePass::object_sync_modifier(Manager &manager, const bool use_slice = settings.axis_slice_method == AXIS_SLICE_SINGLE; sub_ps.shader_set(get_shader(use_slice, settings.use_coba, settings.interp_method, true)); + sub_ps.push_constant("do_depth_test", scene_state.shading.type >= OB_SOLID); if (settings.use_coba) { const bool show_flags = settings.coba_field == FLUID_DOMAIN_FIELD_FLAGS;