Skip to content

Commit 88d9903

Browse files
committed
Merge pull request godotengine#86138 from EnlightenedOne/master
Fix Frustum Sky projection translation logic shearing
2 parents 2450dee + 1d141ab commit 88d9903

File tree

9 files changed

+37
-12
lines changed

9 files changed

+37
-12
lines changed

drivers/gles3/rasterizer_scene_gles3.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2262,6 +2262,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
22622262
render_data.inv_cam_transform = render_data.cam_transform.affine_inverse();
22632263
render_data.cam_projection = p_camera_data->main_projection;
22642264
render_data.cam_orthogonal = p_camera_data->is_orthogonal;
2265+
render_data.cam_frustum = p_camera_data->is_frustum;
22652266
render_data.camera_visible_layers = p_camera_data->visible_layers;
22662267
render_data.main_cam_transform = p_camera_data->main_transform;
22672268

@@ -2622,14 +2623,18 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_
26222623
scene_state.enable_gl_blend(false);
26232624
scene_state.set_gl_cull_mode(GLES3::SceneShaderData::CULL_BACK);
26242625

2626+
Transform3D transform = render_data.cam_transform;
26252627
Projection projection = render_data.cam_projection;
26262628
if (is_reflection_probe) {
26272629
Projection correction;
26282630
correction.columns[1][1] = -1.0;
26292631
projection = correction * render_data.cam_projection;
2632+
} else if (render_data.cam_frustum) {
2633+
// Sky is drawn upside down, the frustum offset doesn't know the image is upside down so needs a flip.
2634+
projection[2].y = -projection[2].y;
26302635
}
26312636

2632-
_draw_sky(render_data.environment, projection, render_data.cam_transform, sky_energy_multiplier, render_data.luminance_multiplier, p_camera_data->view_count > 1, flip_y, apply_color_adjustments_in_post);
2637+
_draw_sky(render_data.environment, projection, transform, sky_energy_multiplier, render_data.luminance_multiplier, p_camera_data->view_count > 1, flip_y, apply_color_adjustments_in_post);
26332638
}
26342639

26352640
if (rt && (scene_state.used_screen_texture || scene_state.used_depth_texture)) {

drivers/gles3/rasterizer_scene_gles3.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ struct RenderDataGLES3 {
103103
Transform3D inv_cam_transform;
104104
Projection cam_projection;
105105
bool cam_orthogonal = false;
106+
bool cam_frustum = false;
106107
uint32_t camera_visible_layers = 0xFFFFFFFF;
107108

108109
// For billboards to cast correct shadows.

servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1965,7 +1965,13 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
19651965

19661966
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);
19671967
} else {
1968-
sky.setup_sky(p_render_data->environment, rb, *p_render_data->lights, p_render_data->camera_attributes, p_render_data->scene_data->view_count, p_render_data->scene_data->view_projection, p_render_data->scene_data->view_eye_offset, p_render_data->scene_data->cam_transform, p_render_data->scene_data->cam_projection, screen_size, p_render_data->scene_data->taa_jitter, this);
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);
19691975
}
19701976

19711977
sky_energy_multiplier *= bg_energy_multiplier;

servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,7 +981,13 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
981981

982982
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);
983983
} else {
984-
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, p_render_data->scene_data->view_projection, p_render_data->scene_data->view_eye_offset, p_render_data->scene_data->cam_transform, p_render_data->scene_data->cam_projection, screen_size, p_render_data->scene_data->taa_jitter, this);
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);
985991
}
986992

987993
sky_energy_multiplier *= bg_energy_multiplier;

servers/rendering/renderer_rd/renderer_scene_render_rd.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,7 @@ void RendererSceneRenderRD::render_scene(const Ref<RenderSceneBuffers> &p_render
11301130
scene_data.cam_transform = p_camera_data->main_transform;
11311131
scene_data.cam_projection = p_camera_data->main_projection;
11321132
scene_data.cam_orthogonal = p_camera_data->is_orthogonal;
1133+
scene_data.cam_frustum = p_camera_data->is_frustum;
11331134
scene_data.camera_visible_layers = p_camera_data->visible_layers;
11341135
scene_data.taa_jitter = p_camera_data->taa_jitter;
11351136
scene_data.taa_frame_count = p_camera_data->taa_frame_count;

servers/rendering/renderer_rd/storage_rd/render_scene_data_rd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class RenderSceneDataRD : public RenderSceneData {
5151
float taa_frame_count = 0.0f;
5252
uint32_t camera_visible_layers;
5353
bool cam_orthogonal = false;
54+
bool cam_frustum = false;
5455
bool flip_y = false;
5556

5657
// For billboards to cast correct shadows.

servers/rendering/renderer_scene_cull.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2738,6 +2738,7 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
27382738
Projection projection;
27392739
bool vaspect = camera->vaspect;
27402740
bool is_orthogonal = false;
2741+
bool is_frustum = false;
27412742

27422743
switch (camera->type) {
27432744
case Camera::ORTHOGONAL: {
@@ -2766,10 +2767,11 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
27662767
camera->znear,
27672768
camera->zfar,
27682769
camera->vaspect);
2770+
is_frustum = true;
27692771
} break;
27702772
}
27712773

2772-
camera_data.set_camera(transform, projection, is_orthogonal, vaspect, jitter, taa_frame_count, camera->visible_layers);
2774+
camera_data.set_camera(transform, projection, is_orthogonal, is_frustum, vaspect, jitter, taa_frame_count, camera->visible_layers);
27732775
} else {
27742776
// Setup our camera for our XR interface.
27752777
// We can support multiple views here each with their own camera
@@ -2791,9 +2793,9 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
27912793
}
27922794

27932795
if (view_count == 1) {
2794-
camera_data.set_camera(transforms[0], projections[0], false, camera->vaspect, jitter, p_jitter_phase_count, camera->visible_layers);
2796+
camera_data.set_camera(transforms[0], projections[0], false, false, camera->vaspect, jitter, p_jitter_phase_count, camera->visible_layers);
27952797
} else if (view_count == 2) {
2796-
camera_data.set_multiview_camera(view_count, transforms, projections, false, camera->vaspect);
2798+
camera_data.set_multiview_camera(view_count, transforms, projections, false, false, camera->vaspect);
27972799
} else {
27982800
// this won't be called (see fail check above) but keeping this comment to indicate we may support more then 2 views in the future...
27992801
}
@@ -3641,7 +3643,7 @@ void RendererSceneCull::render_empty_scene(const Ref<RenderSceneBuffers> &p_rend
36413643
RENDER_TIMESTAMP("Render Empty 3D Scene");
36423644

36433645
RendererSceneRender::CameraData camera_data;
3644-
camera_data.set_camera(Transform3D(), Projection(), true, false);
3646+
camera_data.set_camera(Transform3D(), Projection(), true, false, false);
36453647

36463648
scene_render->render_scene(p_render_buffers, &camera_data, &camera_data, PagedArray<RenderGeometryInstance *>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), environment, RID(), compositor, p_shadow_atlas, RID(), scenario->reflection_atlas, RID(), 0, 0, nullptr, 0, nullptr, 0, nullptr);
36473649
#endif
@@ -3719,7 +3721,7 @@ bool RendererSceneCull::_render_reflection_probe_step(Instance *p_instance, int
37193721

37203722
RENDER_TIMESTAMP("Render ReflectionProbe, Step " + itos(p_step));
37213723
RendererSceneRender::CameraData camera_data;
3722-
camera_data.set_camera(xform, cm, false, false);
3724+
camera_data.set_camera(xform, cm, false, false, false);
37233725

37243726
Ref<RenderSceneBuffers> render_buffers = RSG::light_storage->reflection_probe_atlas_get_render_buffers(scenario->reflection_atlas);
37253727
_render_scene(&camera_data, render_buffers, environment, RID(), RID(), RSG::light_storage->reflection_probe_get_cull_mask(p_instance->base), p_instance->scenario->self, RID(), shadow_atlas, reflection_probe->instance, p_step, mesh_lod_threshold, use_shadows);

servers/rendering/renderer_scene_render.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@
3333
/////////////////////////////////////////////////////////////////////////////
3434
// CameraData
3535

36-
void RendererSceneRender::CameraData::set_camera(const Transform3D p_transform, const Projection p_projection, bool p_is_orthogonal, bool p_vaspect, const Vector2 &p_taa_jitter, float p_taa_frame_count, const uint32_t p_visible_layers) {
36+
void RendererSceneRender::CameraData::set_camera(const Transform3D p_transform, const Projection p_projection, bool p_is_orthogonal, bool p_is_frustum, bool p_vaspect, const Vector2 &p_taa_jitter, float p_taa_frame_count, const uint32_t p_visible_layers) {
3737
view_count = 1;
3838
is_orthogonal = p_is_orthogonal;
39+
is_frustum = p_is_frustum;
3940
vaspect = p_vaspect;
4041

4142
main_transform = p_transform;
@@ -48,12 +49,13 @@ void RendererSceneRender::CameraData::set_camera(const Transform3D p_transform,
4849
taa_frame_count = p_taa_frame_count;
4950
}
5051

51-
void RendererSceneRender::CameraData::set_multiview_camera(uint32_t p_view_count, const Transform3D *p_transforms, const Projection *p_projections, bool p_is_orthogonal, bool p_vaspect) {
52+
void RendererSceneRender::CameraData::set_multiview_camera(uint32_t p_view_count, const Transform3D *p_transforms, const Projection *p_projections, bool p_is_orthogonal, bool p_is_frustum, bool p_vaspect) {
5253
ERR_FAIL_COND_MSG(p_view_count != 2, "Incorrect view count for stereoscopic view");
5354

5455
visible_layers = 0xFFFFFFFF;
5556
view_count = p_view_count;
5657
is_orthogonal = p_is_orthogonal;
58+
is_frustum = p_is_frustum;
5759
vaspect = p_vaspect;
5860
Vector<Plane> planes[2];
5961

servers/rendering/renderer_scene_render.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ class RendererSceneRender {
300300
// flags
301301
uint32_t view_count;
302302
bool is_orthogonal;
303+
bool is_frustum;
303304
uint32_t visible_layers;
304305
bool vaspect;
305306

@@ -312,8 +313,8 @@ class RendererSceneRender {
312313
Vector2 taa_jitter;
313314
float taa_frame_count = 0.0f;
314315

315-
void set_camera(const Transform3D p_transform, const Projection p_projection, bool p_is_orthogonal, bool p_vaspect, const Vector2 &p_taa_jitter = Vector2(), float p_taa_frame_count = 0.0f, uint32_t p_visible_layers = 0xFFFFFFFF);
316-
void set_multiview_camera(uint32_t p_view_count, const Transform3D *p_transforms, const Projection *p_projections, bool p_is_orthogonal, bool p_vaspect);
316+
void set_camera(const Transform3D p_transform, const Projection p_projection, bool p_is_orthogonal, bool p_is_frustum, bool p_vaspect, const Vector2 &p_taa_jitter = Vector2(), float p_taa_frame_count = 0.0f, uint32_t p_visible_layers = 0xFFFFFFFF);
317+
void set_multiview_camera(uint32_t p_view_count, const Transform3D *p_transforms, const Projection *p_projections, bool p_is_orthogonal, bool p_is_frustum, bool p_vaspect);
317318
};
318319

319320
virtual void render_scene(const Ref<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_compositor, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data = nullptr, RenderingMethod::RenderInfo *r_render_info = nullptr) = 0;

0 commit comments

Comments
 (0)