From 8c3d87f6459c1c99377ccf99d41d0a7fc564e1c0 Mon Sep 17 00:00:00 2001 From: Baplar Date: Thu, 4 Jun 2026 15:30:17 +0200 Subject: [PATCH] Fix skyboxes in orthographic camera projection --- crates/renderide/shaders/modules/skybox/common.wgsl | 2 +- .../shaders/passes/backend/skybox_proceduralskybox.wgsl | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/renderide/shaders/modules/skybox/common.wgsl b/crates/renderide/shaders/modules/skybox/common.wgsl index 047526175..ac651a112 100644 --- a/crates/renderide/shaders/modules/skybox/common.wgsl +++ b/crates/renderide/shaders/modules/skybox/common.wgsl @@ -42,7 +42,7 @@ fn view_is_orthographic(sky: SkyboxView, view_layer: u32) -> bool { /// Reconstructs a view-space sky ray from NDC and packed projection coefficients. fn view_ray_from_ndc(ndc: vec2, proj_params: vec4, orthographic: bool) -> vec3 { if (orthographic) { - return vec3(0.0, 0.0, -1.0); + return vec3(ndc.xy, -1.0); } // Asymmetric OpenXR projections store skew on the Z column. With sky rays fixed at z = -1 // and clip_w = -view_z, inverse projection uses ndc + skew. diff --git a/crates/renderide/shaders/passes/backend/skybox_proceduralskybox.wgsl b/crates/renderide/shaders/passes/backend/skybox_proceduralskybox.wgsl index 44f3e8e52..336a545f5 100644 --- a/crates/renderide/shaders/passes/backend/skybox_proceduralskybox.wgsl +++ b/crates/renderide/shaders/passes/backend/skybox_proceduralskybox.wgsl @@ -106,12 +106,14 @@ fn clip_pos_from_view_ray( orthographic: bool, ) -> vec4 { if (view_ray.z >= -1e-6) { + // Send point behind near plane return vec4(view_ray.xy, 2.0, 1.0); } + let camera_ray = view_ray.xy / (-view_ray.z); if (orthographic) { - return vec4(sign(view_ray.xy), 0.0, 1.0); + return vec4(camera_ray * sign(proj_params.xy), 0.0, 1.0); } - return vec4(view_ray.xy * proj_params.xy / (-view_ray.z) - proj_params.zw, 0.0, 1.0); + return vec4(camera_ray * proj_params.xy - proj_params.zw, 0.0, 1.0); } fn view_ray_from_world_ray(world_ray: vec3, view_layer: u32) -> vec3 {