From bdbbed8ea95c955823d8c31b154043eca2aa7515 Mon Sep 17 00:00:00 2001 From: Colby Klein Date: Fri, 24 Oct 2025 09:16:37 -0700 Subject: [PATCH] Revise fog blending to fix over-darkening/borders. This can result in low fog densities being a bit brighter, which may need slight adjustment in your scenes. In exchange, volumetrics now blend smoothly together with the scene and regular fog. Fixes #101514 --- .../renderer_rd/shaders/environment/sky.glsl | 2 +- .../scene_forward_clustered.glsl | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/servers/rendering/renderer_rd/shaders/environment/sky.glsl b/servers/rendering/renderer_rd/shaders/environment/sky.glsl index 6f8d5e19090f..5ba1ab5b3f0c 100644 --- a/servers/rendering/renderer_rd/shaders/environment/sky.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/sky.glsl @@ -281,7 +281,7 @@ void main() { if (sky_scene_data.volumetric_fog_enabled) { vec4 fog = volumetric_fog_process(uv); - frag_color.rgb = mix(frag_color.rgb, fog.rgb, fog.a * sky_scene_data.volumetric_fog_sky_affect); + frag_color.rgb = frag_color.rgb * (1.0 - fog.a * sky_scene_data.volumetric_fog_sky_affect) + fog.rgb * sky_scene_data.volumetric_fog_sky_affect; } if (custom_fog.a > 0.0) { 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 71d5f1b40237..b4a1f6347e91 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 @@ -1443,20 +1443,21 @@ void fragment_shader(in SceneData scene_data) { #else vec4 volumetric_fog = volumetric_fog_process(screen_uv, -vertex.z); #endif + vec4 res = vec4(0.0); if (bool(scene_data.flags & SCENE_DATA_FLAGS_USE_FOG)) { //must use the full blending equation here to blend fogs - vec4 res; float sa = 1.0 - volumetric_fog.a; res.a = fog.a * sa + volumetric_fog.a; - if (res.a == 0.0) { - res.rgb = vec3(0.0); - } else { - res.rgb = (fog.rgb * fog.a * sa + volumetric_fog.rgb * volumetric_fog.a) / res.a; + if (res.a > 0.0) { + res.rgb = (fog.rgb * fog.a * sa + volumetric_fog.rgb) / res.a; } - fog = res; } else { - fog = volumetric_fog; + res.a = volumetric_fog.a; + if (res.a > 0.0) { + res.rgb = volumetric_fog.rgb / res.a; + } } + fog = res; } #endif //!CUSTOM_FOG_USED