Skip to content

Commit 7c1f425

Browse files
committed
Merge pull request #99448 from clayjohn/RD-sky-flip
Unify y-flip behavior for sky in RD backends
2 parents 70963cf + 02efdb2 commit 7c1f425

File tree

5 files changed

+70
-94
lines changed

5 files changed

+70
-94
lines changed

servers/rendering/renderer_rd/environment/sky.cpp

Lines changed: 64 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -972,26 +972,26 @@ SkyRD::~SkyRD() {
972972
}
973973
}
974974

975-
void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, const PagedArray<RID> &p_lights, RID p_camera_attributes, uint32_t p_view_count, const Projection *p_view_projections, const Vector3 *p_view_eye_offsets, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const Size2i p_screen_size, Vector2 p_jitter, RendererSceneRenderRD *p_scene_render) {
975+
void SkyRD::setup_sky(const RenderDataRD *p_render_data, const Size2i p_screen_size) {
976976
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
977977
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
978-
ERR_FAIL_COND(p_env.is_null());
978+
ERR_FAIL_COND(p_render_data->environment.is_null());
979979

980-
ERR_FAIL_COND(p_render_buffers.is_null());
980+
ERR_FAIL_COND(p_render_data->render_buffers.is_null());
981981

982982
// make sure we support our view count
983-
ERR_FAIL_COND(p_view_count == 0);
984-
ERR_FAIL_COND(p_view_count > RendererSceneRender::MAX_RENDER_VIEWS);
983+
ERR_FAIL_COND(p_render_data->scene_data->view_count == 0);
984+
ERR_FAIL_COND(p_render_data->scene_data->view_count > RendererSceneRender::MAX_RENDER_VIEWS);
985985

986986
SkyMaterialData *material = nullptr;
987-
Sky *sky = get_sky(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
987+
Sky *sky = get_sky(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_render_data->environment));
988988

989989
RID sky_material;
990990

991991
SkyShaderData *shader_data = nullptr;
992992

993993
if (sky) {
994-
sky_material = sky_get_material(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
994+
sky_material = sky_get_material(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_render_data->environment));
995995

996996
if (sky_material.is_valid()) {
997997
material = static_cast<SkyMaterialData *>(material_storage->material_get_data(sky_material, RendererRD::MaterialStorage::SHADER_TYPE_SKY));
@@ -1025,8 +1025,8 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
10251025
update_dirty_skys();
10261026
}
10271027

1028-
if (shader_data->uses_time && p_scene_render->time - sky->prev_time > 0.00001) {
1029-
sky->prev_time = p_scene_render->time;
1028+
if (shader_data->uses_time && p_render_data->scene_data->time - sky->prev_time > 0.00001) {
1029+
sky->prev_time = p_render_data->scene_data->time;
10301030
sky->reflection.dirty = true;
10311031
RenderingServerDefault::redraw_request();
10321032
}
@@ -1041,29 +1041,30 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
10411041
sky->reflection.dirty = true;
10421042
}
10431043

1044-
if (!p_cam_transform.origin.is_equal_approx(sky->prev_position) && shader_data->uses_position) {
1045-
sky->prev_position = p_cam_transform.origin;
1044+
if (!p_render_data->scene_data->cam_transform.origin.is_equal_approx(sky->prev_position) && shader_data->uses_position) {
1045+
sky->prev_position = p_render_data->scene_data->cam_transform.origin;
10461046
sky->reflection.dirty = true;
10471047
}
10481048
}
10491049

10501050
sky_scene_state.ubo.directional_light_count = 0;
10511051
if (shader_data->uses_light) {
1052+
const PagedArray<RID> &lights = *p_render_data->lights;
10521053
// Run through the list of lights in the scene and pick out the Directional Lights.
10531054
// This can't be done in RenderSceneRenderRD::_setup lights because that needs to be called
10541055
// after the depth prepass, but this runs before the depth prepass.
1055-
for (int i = 0; i < (int)p_lights.size(); i++) {
1056-
if (!light_storage->owns_light_instance(p_lights[i])) {
1056+
for (int i = 0; i < (int)lights.size(); i++) {
1057+
if (!light_storage->owns_light_instance(lights[i])) {
10571058
continue;
10581059
}
1059-
RID base = light_storage->light_instance_get_base_light(p_lights[i]);
1060+
RID base = light_storage->light_instance_get_base_light(lights[i]);
10601061

10611062
ERR_CONTINUE(base.is_null());
10621063

10631064
RS::LightType type = light_storage->light_get_type(base);
10641065
if (type == RS::LIGHT_DIRECTIONAL && light_storage->light_directional_get_sky_mode(base) != RS::LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_ONLY) {
10651066
SkyDirectionalLightData &sky_light_data = sky_scene_state.directional_lights[sky_scene_state.ubo.directional_light_count];
1066-
Transform3D light_transform = light_storage->light_instance_get_base_transform(p_lights[i]);
1067+
Transform3D light_transform = light_storage->light_instance_get_base_transform(lights[i]);
10671068
Vector3 world_direction = light_transform.basis.xform(Vector3(0, 0, 1)).normalized();
10681069

10691070
sky_light_data.direction[0] = world_direction.x;
@@ -1073,12 +1074,12 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
10731074
float sign = light_storage->light_is_negative(base) ? -1 : 1;
10741075
sky_light_data.energy = sign * light_storage->light_get_param(base, RS::LIGHT_PARAM_ENERGY);
10751076

1076-
if (p_scene_render->is_using_physical_light_units()) {
1077+
if (RendererSceneRenderRD::get_singleton()->is_using_physical_light_units()) {
10771078
sky_light_data.energy *= light_storage->light_get_param(base, RS::LIGHT_PARAM_INTENSITY);
10781079
}
10791080

1080-
if (p_camera_attributes.is_valid()) {
1081-
sky_light_data.energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_camera_attributes);
1081+
if (p_render_data->camera_attributes.is_valid()) {
1082+
sky_light_data.energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor(p_render_data->camera_attributes);
10821083
}
10831084

10841085
Color linear_col = light_storage->light_get_color(base).srgb_to_linear();
@@ -1149,69 +1150,74 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
11491150

11501151
// Setup fog variables.
11511152
sky_scene_state.ubo.volumetric_fog_enabled = false;
1152-
if (p_render_buffers.is_valid()) {
1153-
if (p_render_buffers->has_custom_data(RB_SCOPE_FOG)) {
1154-
Ref<RendererRD::Fog::VolumetricFog> fog = p_render_buffers->get_custom_data(RB_SCOPE_FOG);
1155-
sky_scene_state.ubo.volumetric_fog_enabled = true;
1156-
1157-
float fog_end = fog->length;
1158-
if (fog_end > 0.0) {
1159-
sky_scene_state.ubo.volumetric_fog_inv_length = 1.0 / fog_end;
1160-
} else {
1161-
sky_scene_state.ubo.volumetric_fog_inv_length = 1.0;
1162-
}
1153+
if (p_render_data->render_buffers->has_custom_data(RB_SCOPE_FOG)) {
1154+
Ref<RendererRD::Fog::VolumetricFog> fog = p_render_data->render_buffers->get_custom_data(RB_SCOPE_FOG);
1155+
sky_scene_state.ubo.volumetric_fog_enabled = true;
11631156

1164-
float fog_detail_spread = fog->spread; // Reverse lookup.
1165-
if (fog_detail_spread > 0.0) {
1166-
sky_scene_state.ubo.volumetric_fog_detail_spread = 1.0 / fog_detail_spread;
1167-
} else {
1168-
sky_scene_state.ubo.volumetric_fog_detail_spread = 1.0;
1169-
}
1157+
float fog_end = fog->length;
1158+
if (fog_end > 0.0) {
1159+
sky_scene_state.ubo.volumetric_fog_inv_length = 1.0 / fog_end;
1160+
} else {
1161+
sky_scene_state.ubo.volumetric_fog_inv_length = 1.0;
1162+
}
11701163

1171-
sky_scene_state.fog_uniform_set = fog->sky_uniform_set;
1164+
float fog_detail_spread = fog->spread; // Reverse lookup.
1165+
if (fog_detail_spread > 0.0) {
1166+
sky_scene_state.ubo.volumetric_fog_detail_spread = 1.0 / fog_detail_spread;
1167+
} else {
1168+
sky_scene_state.ubo.volumetric_fog_detail_spread = 1.0;
11721169
}
1170+
1171+
sky_scene_state.fog_uniform_set = fog->sky_uniform_set;
11731172
}
11741173

1174+
sky_scene_state.view_count = p_render_data->scene_data->view_count;
1175+
sky_scene_state.cam_transform = p_render_data->scene_data->cam_transform;
1176+
11751177
Projection correction;
1176-
correction.set_depth_correction(false, true);
1177-
correction.add_jitter_offset(p_jitter);
1178+
correction.set_depth_correction(p_render_data->scene_data->flip_y, true);
1179+
correction.add_jitter_offset(p_render_data->scene_data->taa_jitter);
1180+
1181+
Projection projection = p_render_data->scene_data->cam_projection;
1182+
if (p_render_data->scene_data->cam_frustum) {
1183+
// We don't use a full projection matrix for the sky, this is enough to make up for it.
1184+
projection[2].y = -projection[2].y;
1185+
}
11781186

1179-
sky_scene_state.view_count = p_view_count;
1180-
sky_scene_state.cam_transform = p_cam_transform;
1181-
sky_scene_state.cam_projection = correction * p_cam_projection; // We only use this when rendering a single view.
1187+
sky_scene_state.cam_projection = correction * projection;
11821188

11831189
// Our info in our UBO is only used if we're rendering stereo.
1184-
for (uint32_t i = 0; i < p_view_count; i++) {
1185-
Projection view_inv_projection = (correction * p_view_projections[i]).inverse();
1186-
if (p_view_count > 1) {
1190+
for (uint32_t i = 0; i < p_render_data->scene_data->view_count; i++) {
1191+
Projection view_inv_projection = (correction * p_render_data->scene_data->view_projection[i]).inverse();
1192+
if (p_render_data->scene_data->view_count > 1) {
11871193
// Reprojection is used when we need to have things in combined space.
1188-
RendererRD::MaterialStorage::store_camera(p_cam_projection * view_inv_projection, sky_scene_state.ubo.combined_reprojection[i]);
1194+
RendererRD::MaterialStorage::store_camera(p_render_data->scene_data->cam_projection * view_inv_projection, sky_scene_state.ubo.combined_reprojection[i]);
11891195
} else {
11901196
// This is unused so just reset to identity.
11911197
Projection ident;
11921198
RendererRD::MaterialStorage::store_camera(ident, sky_scene_state.ubo.combined_reprojection[i]);
11931199
}
11941200

11951201
RendererRD::MaterialStorage::store_camera(view_inv_projection, sky_scene_state.ubo.view_inv_projections[i]);
1196-
sky_scene_state.ubo.view_eye_offsets[i][0] = p_view_eye_offsets[i].x;
1197-
sky_scene_state.ubo.view_eye_offsets[i][1] = p_view_eye_offsets[i].y;
1198-
sky_scene_state.ubo.view_eye_offsets[i][2] = p_view_eye_offsets[i].z;
1202+
sky_scene_state.ubo.view_eye_offsets[i][0] = p_render_data->scene_data->view_eye_offset[i].x;
1203+
sky_scene_state.ubo.view_eye_offsets[i][1] = p_render_data->scene_data->view_eye_offset[i].y;
1204+
sky_scene_state.ubo.view_eye_offsets[i][2] = p_render_data->scene_data->view_eye_offset[i].z;
11991205
sky_scene_state.ubo.view_eye_offsets[i][3] = 0.0;
12001206
}
12011207

1202-
sky_scene_state.ubo.z_far = p_view_projections[0].get_z_far(); // Should be the same for all projection.
1203-
sky_scene_state.ubo.fog_enabled = RendererSceneRenderRD::get_singleton()->environment_get_fog_enabled(p_env);
1204-
sky_scene_state.ubo.fog_density = RendererSceneRenderRD::get_singleton()->environment_get_fog_density(p_env);
1205-
sky_scene_state.ubo.fog_aerial_perspective = RendererSceneRenderRD::get_singleton()->environment_get_fog_aerial_perspective(p_env);
1206-
Color fog_color = RendererSceneRenderRD::get_singleton()->environment_get_fog_light_color(p_env).srgb_to_linear();
1207-
float fog_energy = RendererSceneRenderRD::get_singleton()->environment_get_fog_light_energy(p_env);
1208+
sky_scene_state.ubo.z_far = p_render_data->scene_data->view_projection[0].get_z_far(); // Should be the same for all projection.
1209+
sky_scene_state.ubo.fog_enabled = RendererSceneRenderRD::get_singleton()->environment_get_fog_enabled(p_render_data->environment);
1210+
sky_scene_state.ubo.fog_density = RendererSceneRenderRD::get_singleton()->environment_get_fog_density(p_render_data->environment);
1211+
sky_scene_state.ubo.fog_aerial_perspective = RendererSceneRenderRD::get_singleton()->environment_get_fog_aerial_perspective(p_render_data->environment);
1212+
Color fog_color = RendererSceneRenderRD::get_singleton()->environment_get_fog_light_color(p_render_data->environment).srgb_to_linear();
1213+
float fog_energy = RendererSceneRenderRD::get_singleton()->environment_get_fog_light_energy(p_render_data->environment);
12081214
sky_scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy;
12091215
sky_scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy;
12101216
sky_scene_state.ubo.fog_light_color[2] = fog_color.b * fog_energy;
1211-
sky_scene_state.ubo.fog_sun_scatter = RendererSceneRenderRD::get_singleton()->environment_get_fog_sun_scatter(p_env);
1217+
sky_scene_state.ubo.fog_sun_scatter = RendererSceneRenderRD::get_singleton()->environment_get_fog_sun_scatter(p_render_data->environment);
12121218

1213-
sky_scene_state.ubo.fog_sky_affect = RendererSceneRenderRD::get_singleton()->environment_get_fog_sky_affect(p_env);
1214-
sky_scene_state.ubo.volumetric_fog_sky_affect = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_sky_affect(p_env);
1219+
sky_scene_state.ubo.fog_sky_affect = RendererSceneRenderRD::get_singleton()->environment_get_fog_sky_affect(p_render_data->environment);
1220+
sky_scene_state.ubo.volumetric_fog_sky_affect = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_sky_affect(p_render_data->environment);
12151221

12161222
RD::get_singleton()->buffer_update(sky_scene_state.uniform_buffer, 0, sizeof(SkySceneState::UBO), &sky_scene_state.ubo);
12171223
}
@@ -1292,7 +1298,7 @@ void SkyRD::update_radiance_buffers(Ref<RenderSceneBuffersRD> p_render_buffers,
12921298
Projection cm;
12931299
cm.set_perspective(90, 1, 0.01, 10.0);
12941300
Projection correction;
1295-
correction.set_depth_correction(true);
1301+
correction.set_depth_correction(false);
12961302
cm = correction * cm;
12971303

12981304
// Note, we ignore environment_get_sky_orientation here as this is applied when we do our lookup in our scene shader.

servers/rendering/renderer_rd/environment/sky.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
3737
#include "servers/rendering/renderer_rd/shaders/environment/sky.glsl.gen.h"
3838
#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
39+
#include "servers/rendering/renderer_rd/storage_rd/render_data_rd.h"
3940
#include "servers/rendering/renderer_scene_render.h"
4041
#include "servers/rendering/rendering_device.h"
4142
#include "servers/rendering/shader_compiler.h"
@@ -294,7 +295,7 @@ class SkyRD {
294295
void set_texture_format(RD::DataFormat p_texture_format);
295296
~SkyRD();
296297

297-
void setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, const PagedArray<RID> &p_lights, RID p_camera_attributes, uint32_t p_view_count, const Projection *p_view_projections, const Vector3 *p_view_eye_offsets, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const Size2i p_screen_size, Vector2 p_jitter, RendererSceneRenderRD *p_scene_render);
298+
void setup_sky(const RenderDataRD *p_render_data, const Size2i p_screen_size);
298299
void update_radiance_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_env, const Vector3 &p_global_pos, double p_time, float p_luminance_multiplier = 1.0);
299300
void update_res_buffers(Ref<RenderSceneBuffersRD> p_render_buffers, RID p_env, double p_time, float p_luminance_multiplier = 1.0);
300301
void draw_sky(RD::DrawListID p_draw_list, Ref<RenderSceneBuffersRD> p_render_buffers, RID p_env, RID p_fb, double p_time, float p_luminance_multiplier = 1.0);

servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,22 +1957,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
19571957
RD::get_singleton()->draw_command_begin_label("Setup Sky");
19581958

19591959
// Setup our sky render information for this frame/viewport
1960-
if (is_reflection_probe) {
1961-
Vector3 eye_offset;
1962-
Projection correction;
1963-
correction.set_depth_correction(true);
1964-
Projection projection = correction * p_render_data->scene_data->cam_projection;
1965-
1966-
sky.setup_sky(p_render_data->environment, rb, *p_render_data->lights, p_render_data->camera_attributes, 1, &projection, &eye_offset, p_render_data->scene_data->cam_transform, projection, screen_size, Vector2(0.0f, 0.0f), this);
1967-
} else {
1968-
Projection projection = p_render_data->scene_data->cam_projection;
1969-
if (p_render_data->scene_data->cam_frustum) {
1970-
// Sky is drawn upside down, the frustum offset doesn't know the image is upside down so needs a flip.
1971-
projection[2].y = -projection[2].y;
1972-
}
1973-
1974-
sky.setup_sky(p_render_data->environment, rb, *p_render_data->lights, p_render_data->camera_attributes, p_render_data->scene_data->view_count, &projection, p_render_data->scene_data->view_eye_offset, p_render_data->scene_data->cam_transform, projection, screen_size, p_render_data->scene_data->taa_jitter, this);
1975-
}
1960+
sky.setup_sky(p_render_data, screen_size);
19761961

19771962
sky_energy_multiplier *= bg_energy_multiplier;
19781963

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -972,23 +972,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
972972
RENDER_TIMESTAMP("Setup Sky");
973973
RD::get_singleton()->draw_command_begin_label("Setup Sky");
974974

975-
// Setup our sky render information for this frame/viewport
976-
if (is_reflection_probe) {
977-
Vector3 eye_offset;
978-
Projection correction;
979-
correction.set_depth_correction(true);
980-
Projection projection = correction * p_render_data->scene_data->cam_projection;
981-
982-
sky.setup_sky(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, p_render_data->camera_attributes, 1, &projection, &eye_offset, p_render_data->scene_data->cam_transform, projection, screen_size, Vector2(0.0f, 0.0f), this);
983-
} else {
984-
Projection projection = p_render_data->scene_data->cam_projection;
985-
if (p_render_data->scene_data->cam_frustum) {
986-
// Sky is drawn upside down, the frustum offset doesn't know the image is upside down so needs a flip.
987-
projection[2].y = -projection[2].y;
988-
}
989-
990-
sky.setup_sky(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, p_render_data->camera_attributes, p_render_data->scene_data->view_count, &projection, p_render_data->scene_data->view_eye_offset, p_render_data->scene_data->cam_transform, projection, screen_size, p_render_data->scene_data->taa_jitter, this);
991-
}
975+
sky.setup_sky(p_render_data, screen_size);
992976

993977
sky_energy_multiplier *= bg_energy_multiplier;
994978

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ void main() {
189189
vec3 cube_normal;
190190
#ifdef USE_MULTIVIEW
191191
// In multiview our projection matrices will contain positional and rotational offsets that we need to properly unproject.
192-
vec4 unproject = vec4(uv_interp.x, -uv_interp.y, 0.0, 1.0); // unproject at the far plane
192+
vec4 unproject = vec4(uv_interp.x, uv_interp.y, 0.0, 1.0); // unproject at the far plane
193193
vec4 unprojected = sky_scene_data.view_inv_projections[ViewIndex] * unproject;
194194
cube_normal = unprojected.xyz / unprojected.w;
195195

@@ -198,7 +198,7 @@ void main() {
198198
#else
199199
cube_normal.z = -1.0;
200200
cube_normal.x = (cube_normal.z * (-uv_interp.x - params.projection.x)) / params.projection.y;
201-
cube_normal.y = -(cube_normal.z * (-uv_interp.y - params.projection.z)) / params.projection.w;
201+
cube_normal.y = -(cube_normal.z * (uv_interp.y - params.projection.z)) / params.projection.w;
202202
#endif
203203
cube_normal = mat3(params.orientation) * cube_normal;
204204
cube_normal = normalize(cube_normal);

0 commit comments

Comments
 (0)