diff options
Diffstat (limited to 'servers/rendering/renderer_rd/shaders')
3 files changed, 29 insertions, 6 deletions
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 cb95621219..6eae64c04e 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 @@ -656,6 +656,7 @@ layout(constant_id = 9) const uint sc_directional_penumbra_shadow_samples = 4; layout(constant_id = 10) const bool sc_decal_use_mipmaps = true; layout(constant_id = 11) const bool sc_projector_use_mipmaps = true; +layout(constant_id = 12) const bool sc_use_depth_fog = false; // not used in clustered renderer but we share some code with the mobile renderer that requires this. const float sc_luminance_multiplier = 1.0; @@ -848,7 +849,15 @@ vec4 fog_process(vec3 vertex) { } } - float fog_amount = 1.0 - exp(min(0.0, -length(vertex) * scene_data_block.data.fog_density)); + float fog_amount = 0.0; + + if (sc_use_depth_fog) { + float fog_z = smoothstep(scene_data_block.data.fog_depth_begin, scene_data_block.data.fog_depth_end, length(vertex)); + float fog_quad_amount = pow(fog_z, scene_data_block.data.fog_depth_curve) * scene_data_block.data.fog_density; + fog_amount = fog_quad_amount; + } else { + fog_amount = 1 - exp(min(0.0, -length(vertex) * scene_data_block.data.fog_density)); + } if (abs(scene_data_block.data.fog_height_density) >= 0.0001) { float y = (scene_data_block.data.inv_view_matrix * vec4(vertex, 1.0)).y; 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 e9c69058f2..259edc63a0 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 @@ -525,6 +525,7 @@ layout(constant_id = 12) const bool sc_disable_directional_lights = false; layout(constant_id = 7) const bool sc_decal_use_mipmaps = true; layout(constant_id = 13) const bool sc_disable_decals = false; layout(constant_id = 14) const bool sc_disable_fog = false; +layout(constant_id = 16) const bool sc_use_depth_fog = false; #endif //!MODE_RENDER_DEPTH @@ -690,7 +691,15 @@ vec4 fog_process(vec3 vertex) { } } - float fog_amount = 1.0 - exp(min(0.0, -length(vertex) * scene_data_block.data.fog_density)); + float fog_amount = 0.0; + + if (sc_use_depth_fog) { + float fog_z = smoothstep(scene_data_block.data.fog_depth_begin, scene_data_block.data.fog_depth_end, length(vertex)); + float fog_quad_amount = pow(fog_z, scene_data_block.data.fog_depth_curve) * scene_data_block.data.fog_density; + fog_amount = fog_quad_amount; + } else { + fog_amount = 1 - exp(min(0.0, -length(vertex) * scene_data_block.data.fog_density)); + } if (abs(scene_data_block.data.fog_height_density) >= 0.0001) { float y = (scene_data_block.data.inv_view_matrix * vec4(vertex, 1.0)).y; diff --git a/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl index 70e670c3f7..67542d61fd 100644 --- a/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_data_inc.glsl @@ -49,24 +49,29 @@ struct SceneData { mediump float opaque_prepass_threshold; bool fog_enabled; + uint fog_mode; highp float fog_density; highp float fog_height; highp float fog_height_density; + highp float fog_depth_curve; + highp float pad; + highp float fog_depth_begin; + mediump vec3 fog_light_color; - mediump float fog_sun_scatter; + highp float fog_depth_end; + mediump float fog_sun_scatter; mediump float fog_aerial_perspective; highp float time; mediump float reflection_multiplier; // one normally, zero when rendering reflections - bool material_uv2_mode; vec2 taa_jitter; + bool material_uv2_mode; float emissive_exposure_normalization; - float IBL_exposure_normalization; + float IBL_exposure_normalization; bool pancake_shadows; uint camera_visible_layers; float pass_alpha_multiplier; - uint pad3; }; |