From 7c812cd7e9aaa5145f5309bb6254d0570620bec9 Mon Sep 17 00:00:00 2001 From: Clay Date: Mon, 24 Jul 2023 23:21:04 +0200 Subject: [PATCH] Fix use of discard in shaders discard was being included in all shaders set to depth pass opaque, which is the majority of shaders Instead it should only be used with alpha prepass materials --- drivers/gles3/shaders/scene.glsl | 18 ++++++++---------- drivers/gles3/storage/material_storage.cpp | 2 +- .../scene_shader_forward_clustered.cpp | 2 +- .../scene_shader_forward_mobile.cpp | 2 +- .../scene_forward_clustered.glsl | 10 ++++++++-- .../forward_mobile/scene_forward_mobile.glsl | 10 ++++++++-- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index aa68febec8fe..7cba77be2ff4 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -1039,17 +1039,16 @@ void main() { if (alpha < alpha_scissor_threshold) { discard; } -#endif // ALPHA_SCISSOR_USED - +#else +#ifdef MODE_RENDER_DEPTH #ifdef USE_OPAQUE_PREPASS -#if !defined(ALPHA_SCISSOR_USED) if (alpha < opaque_prepass_threshold) { discard; } - -#endif // not ALPHA_SCISSOR_USED #endif // USE_OPAQUE_PREPASS +#endif // MODE_RENDER_DEPTH +#endif // !ALPHA_SCISSOR_USED #endif // !USE_SHADOW_TO_OPACITY @@ -1270,17 +1269,16 @@ void main() { if (alpha < alpha_scissor) { discard; } -#endif // ALPHA_SCISSOR_USED - +#else +#ifdef MODE_RENDER_DEPTH #ifdef USE_OPAQUE_PREPASS -#if !defined(ALPHA_SCISSOR_USED) if (alpha < opaque_prepass_threshold) { discard; } - -#endif // not ALPHA_SCISSOR_USED #endif // USE_OPAQUE_PREPASS +#endif // MODE_RENDER_DEPTH +#endif // !ALPHA_SCISSOR_USED #endif // USE_SHADOW_TO_OPACITY diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index d0746a8fc80a..aa6319f0ef00 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -1338,7 +1338,7 @@ MaterialStorage::MaterialStorage() { actions.render_mode_defines["cull_front"] = "#define DO_SIDE_CHECK\n"; actions.render_mode_defines["cull_disabled"] = "#define DO_SIDE_CHECK\n"; actions.render_mode_defines["particle_trails"] = "#define USE_PARTICLE_TRAILS\n"; - actions.render_mode_defines["depth_draw_opaque"] = "#define USE_OPAQUE_PREPASS\n"; + actions.render_mode_defines["depth_prepass_alpha"] = "#define USE_OPAQUE_PREPASS\n"; bool force_lambert = GLOBAL_GET("rendering/shading/overrides/force_lambert_over_burley"); diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp index 17e738890068..377aab1354e5 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp @@ -701,7 +701,7 @@ void SceneShaderForwardClustered::init(const String p_defines) { actions.render_mode_defines["cull_front"] = "#define DO_SIDE_CHECK\n"; actions.render_mode_defines["cull_disabled"] = "#define DO_SIDE_CHECK\n"; actions.render_mode_defines["particle_trails"] = "#define USE_PARTICLE_TRAILS\n"; - actions.render_mode_defines["depth_draw_opaque"] = "#define USE_OPAQUE_PREPASS\n"; + actions.render_mode_defines["depth_prepass_alpha"] = "#define USE_OPAQUE_PREPASS\n"; bool force_lambert = GLOBAL_GET("rendering/shading/overrides/force_lambert_over_burley"); diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp index e432dc87d502..e4498ac533f3 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp @@ -589,7 +589,7 @@ void SceneShaderForwardMobile::init(const String p_defines) { actions.render_mode_defines["cull_front"] = "#define DO_SIDE_CHECK\n"; actions.render_mode_defines["cull_disabled"] = "#define DO_SIDE_CHECK\n"; actions.render_mode_defines["particle_trails"] = "#define USE_PARTICLE_TRAILS\n"; - actions.render_mode_defines["depth_draw_opaque"] = "#define USE_OPAQUE_PREPASS\n"; + actions.render_mode_defines["depth_prepass_alpha"] = "#define USE_OPAQUE_PREPASS\n"; bool force_lambert = GLOBAL_GET("rendering/shading/overrides/force_lambert_over_burley"); if (!force_lambert) { diff --git a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl index 8a7008492e18..9214a953aae6 100644 --- a/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_clustered/scene_forward_clustered.glsl @@ -875,11 +875,15 @@ void fragment_shader(in SceneData scene_data) { alpha = compute_alpha_antialiasing_edge(alpha, alpha_texture_coordinate, alpha_antialiasing_edge); #endif // ALPHA_ANTIALIASING_EDGE_USED +#ifdef MODE_RENDER_DEPTH #ifdef USE_OPAQUE_PREPASS +#ifndef ALPHA_SCISSOR_USED if (alpha < scene_data.opaque_prepass_threshold) { discard; } +#endif // !ALPHA_SCISSOR_USED #endif // USE_OPAQUE_PREPASS +#endif // MODE_RENDER_DEPTH #endif // !USE_SHADOW_TO_OPACITY @@ -2038,8 +2042,8 @@ void fragment_shader(in SceneData scene_data) { if (alpha < alpha_scissor) { discard; } -#endif // ALPHA_SCISSOR_USED - +#else +#ifdef MODE_RENDER_DEPTH #ifdef USE_OPAQUE_PREPASS if (alpha < scene_data.opaque_prepass_threshold) { @@ -2047,6 +2051,8 @@ void fragment_shader(in SceneData scene_data) { } #endif // USE_OPAQUE_PREPASS +#endif // MODE_RENDER_DEPTH +#endif // ALPHA_SCISSOR_USED #endif // USE_SHADOW_TO_OPACITY diff --git a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl index 5f6e4a8c286d..b63eea14013e 100644 --- a/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/forward_mobile/scene_forward_mobile.glsl @@ -817,11 +817,15 @@ void main() { alpha = compute_alpha_antialiasing_edge(alpha, alpha_texture_coordinate, alpha_antialiasing_edge); #endif // ALPHA_ANTIALIASING_EDGE_USED +#ifdef MODE_RENDER_DEPTH #ifdef USE_OPAQUE_PREPASS +#ifndef ALPHA_SCISSOR_USED if (alpha < scene_data.opaque_prepass_threshold) { discard; } +#endif // !ALPHA_SCISSOR_USED #endif // USE_OPAQUE_PREPASS +#endif // MODE_RENDER_DEPTH #endif // !USE_SHADOW_TO_OPACITY @@ -1685,8 +1689,8 @@ void main() { if (alpha < alpha_scissor) { discard; } -#endif // ALPHA_SCISSOR_USED - +#else +#ifdef MODE_RENDER_DEPTH #ifdef USE_OPAQUE_PREPASS if (alpha < scene_data.opaque_prepass_threshold) { @@ -1694,6 +1698,8 @@ void main() { } #endif // USE_OPAQUE_PREPASS +#endif // MODE_RENDER_DEPTH +#endif // !ALPHA_SCISSOR_USED #endif // USE_SHADOW_TO_OPACITY