Skip to content

Commit c6400a8

Browse files
committed
Merge pull request #95662 from clayjohn/GLES3-sky-fog
Add fixed fog to the sky in the Compatibility renderer
2 parents 6c76be2 + 578049b commit c6400a8

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

drivers/gles3/rasterizer_scene_gles3.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,6 @@ void RasterizerSceneGLES3::_draw_sky(RID p_env, const Projection &p_projection,
777777
ERR_FAIL_COND(p_env.is_null());
778778

779779
Sky *sky = sky_owner.get_or_null(environment_get_sky(p_env));
780-
ERR_FAIL_NULL(sky);
781780

782781
GLES3::SkyMaterialData *material_data = nullptr;
783782
RID sky_material;
@@ -851,6 +850,15 @@ void RasterizerSceneGLES3::_draw_sky(RID p_env, const Projection &p_projection,
851850
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::SKY_ENERGY_MULTIPLIER, p_sky_energy_multiplier, shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
852851
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::LUMINANCE_MULTIPLIER, p_luminance_multiplier, shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
853852

853+
Color fog_color = environment_get_fog_light_color(p_env).srgb_to_linear() * environment_get_fog_light_energy(p_env);
854+
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::FOG_ENABLED, environment_get_fog_enabled(p_env), shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
855+
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::FOG_AERIAL_PERSPECTIVE, environment_get_fog_aerial_perspective(p_env), shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
856+
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::FOG_LIGHT_COLOR, fog_color, shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
857+
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::FOG_SUN_SCATTER, environment_get_fog_sun_scatter(p_env), shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
858+
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::FOG_DENSITY, environment_get_fog_density(p_env), shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
859+
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::FOG_SKY_AFFECT, environment_get_fog_sky_affect(p_env), shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
860+
material_storage->shaders.sky_shader.version_set_uniform(SkyShaderGLES3::DIRECTIONAL_LIGHT_COUNT, sky_globals.directional_light_count, shader_data->version, SkyShaderGLES3::MODE_BACKGROUND, spec_constants);
861+
854862
if (p_use_multiview) {
855863
glBindBufferBase(GL_UNIFORM_BUFFER, SKY_MULTIVIEW_UNIFORM_LOCATION, scene_state.multiview_buffer);
856864
glBindBuffer(GL_UNIFORM_BUFFER, 0);
@@ -2587,7 +2595,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
25872595

25882596
scene_state.enable_gl_depth_draw(false);
25892597

2590-
if (draw_sky) {
2598+
if (draw_sky || draw_sky_fog_only) {
25912599
RENDER_TIMESTAMP("Render Sky");
25922600

25932601
scene_state.enable_gl_depth_test(true);

drivers/gles3/shaders/sky.glsl

+35-2
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@ uniform float sky_energy_multiplier;
108108
uniform float luminance_multiplier;
109109

110110
uniform float fog_aerial_perspective;
111-
uniform vec3 fog_light_color;
111+
uniform vec4 fog_light_color;
112112
uniform float fog_sun_scatter;
113113
uniform bool fog_enabled;
114114
uniform float fog_density;
115-
uniform float z_far;
115+
uniform float fog_sky_affect;
116116
uniform uint directional_light_count;
117117

118118
#ifdef USE_MULTIVIEW
@@ -135,6 +135,24 @@ vec3 interleaved_gradient_noise(vec2 pos) {
135135
}
136136
#endif
137137

138+
#if !defined(DISABLE_FOG)
139+
vec4 fog_process(vec3 view, vec3 sky_color) {
140+
vec3 fog_color = mix(fog_light_color.rgb, sky_color, fog_aerial_perspective);
141+
142+
if (fog_sun_scatter > 0.001) {
143+
vec4 sun_scatter = vec4(0.0);
144+
float sun_total = 0.0;
145+
for (uint i = 0u; i < directional_light_count; i++) {
146+
vec3 light_color = directional_lights.data[i].color_size.xyz * directional_lights.data[i].direction_energy.w;
147+
float light_amount = pow(max(dot(view, directional_lights.data[i].direction_energy.xyz), 0.0), 8.0);
148+
fog_color += light_color * light_amount * fog_sun_scatter;
149+
}
150+
}
151+
152+
return vec4(fog_color, 1.0);
153+
}
154+
#endif // !DISABLE_FOG
155+
138156
void main() {
139157
vec3 cube_normal;
140158
#ifdef USE_MULTIVIEW
@@ -203,6 +221,21 @@ void main() {
203221

204222
// Convert to Linear for tonemapping so color matches scene shader better
205223
color = srgb_to_linear(color);
224+
225+
#if !defined(DISABLE_FOG) && !defined(USE_CUBEMAP_PASS)
226+
227+
// Draw "fixed" fog before volumetric fog to ensure volumetric fog can appear in front of the sky.
228+
if (fog_enabled) {
229+
vec4 fog = fog_process(cube_normal, color.rgb);
230+
color.rgb = mix(color.rgb, fog.rgb, fog.a * fog_sky_affect);
231+
}
232+
233+
if (custom_fog.a > 0.0) {
234+
color.rgb = mix(color.rgb, custom_fog.rgb, custom_fog.a);
235+
}
236+
237+
#endif // DISABLE_FOG
238+
206239
color *= exposure;
207240
#ifdef APPLY_TONEMAPPING
208241
color = apply_tonemapping(color, white);

servers/rendering/renderer_rd/shaders/environment/sky.glsl

+4-4
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,6 @@ void main() {
255255
frag_color.rgb = color;
256256
frag_color.a = alpha;
257257

258-
// For mobile renderer we're multiplying by 0.5 as we're using a UNORM buffer.
259-
// For both mobile and clustered, we also bake in the exposure value for the environment and camera.
260-
frag_color.rgb = frag_color.rgb * params.luminance_multiplier;
261-
262258
#if !defined(DISABLE_FOG) && !defined(USE_CUBEMAP_PASS)
263259

264260
// Draw "fixed" fog before volumetric fog to ensure volumetric fog can appear in front of the sky.
@@ -278,6 +274,10 @@ void main() {
278274

279275
#endif // DISABLE_FOG
280276

277+
// For mobile renderer we're multiplying by 0.5 as we're using a UNORM buffer.
278+
// For both mobile and clustered, we also bake in the exposure value for the environment and camera.
279+
frag_color.rgb = frag_color.rgb * params.luminance_multiplier;
280+
281281
// Blending is disabled for Sky, so alpha doesn't blend.
282282
// Alpha is used for subsurface scattering so make sure it doesn't get applied to Sky.
283283
if (!AT_CUBEMAP_PASS && !AT_HALF_RES_PASS && !AT_QUARTER_RES_PASS) {

0 commit comments

Comments
 (0)