From 2e8dfc02efef8b95b25c5f2888675296893e8a5c Mon Sep 17 00:00:00 2001 From: Aron Derenyi Date: Mon, 16 May 2022 16:37:33 +0000 Subject: [PATCH] Fixing confusing near and far fields in Camera (#4457) # Objective - Fixes #4456 ## Solution - Removed the `near` and `far` fields from the camera and the views. --- ## Changelog - Removed the `near` and `far` fields from the camera and the views. - Removed the `ClusterFarZMode::CameraFarPlane` far z mode. ## Migration Guide - Cameras no longer accept near and far values during initialization - `ClusterFarZMode::Constant` should be used with the far value instead of `ClusterFarZMode::CameraFarPlane` --- assets/shaders/custom_material.vert | 2 -- crates/bevy_gltf/src/loader.rs | 4 ---- crates/bevy_pbr/src/light.rs | 15 +++++++++++---- crates/bevy_pbr/src/render/light.rs | 8 -------- .../src/render/mesh_view_bind_group.wgsl | 2 -- crates/bevy_render/src/camera/bundle.rs | 18 +++--------------- crates/bevy_render/src/camera/camera.rs | 4 ---- crates/bevy_render/src/view/mod.rs | 6 ------ .../src/mesh2d/mesh2d_view_bind_group.wgsl | 2 -- examples/tools/scene_viewer.rs | 6 ------ 10 files changed, 14 insertions(+), 53 deletions(-) diff --git a/assets/shaders/custom_material.vert b/assets/shaders/custom_material.vert index 56caf7719694e..f18a9fa534f0b 100644 --- a/assets/shaders/custom_material.vert +++ b/assets/shaders/custom_material.vert @@ -10,8 +10,6 @@ layout(set = 0, binding = 0) uniform CameraViewProj { mat4 InverseView; mat4 Projection; vec3 WorldPosition; - float near; - float far; float width; float height; }; diff --git a/crates/bevy_gltf/src/loader.rs b/crates/bevy_gltf/src/loader.rs index 04c391907e0a3..5965109062947 100644 --- a/crates/bevy_gltf/src/loader.rs +++ b/crates/bevy_gltf/src/loader.rs @@ -733,8 +733,6 @@ fn load_node( node.insert(Camera { projection_matrix: orthographic_projection.get_projection_matrix(), - near: orthographic_projection.near, - far: orthographic_projection.far, ..Default::default() }); node.insert(orthographic_projection); @@ -754,8 +752,6 @@ fn load_node( } node.insert(Camera { projection_matrix: perspective_projection.get_projection_matrix(), - near: perspective_projection.near, - far: perspective_projection.far, ..Default::default() }); node.insert(perspective_projection); diff --git a/crates/bevy_pbr/src/light.rs b/crates/bevy_pbr/src/light.rs index ca72b12ba7817..a433403400bb0 100644 --- a/crates/bevy_pbr/src/light.rs +++ b/crates/bevy_pbr/src/light.rs @@ -217,8 +217,6 @@ pub enum SimulationLightSystems { /// rendering #[derive(Debug, Copy, Clone)] pub enum ClusterFarZMode { - /// Use the camera far-plane to determine the z-depth of the furthest cluster layer - CameraFarPlane, /// Calculate the required maximum z-depth based on currently visible lights. /// Makes better use of available clusters, speeding up GPU lighting operations /// at the expense of some CPU time and using more indices in the cluster light @@ -758,7 +756,6 @@ pub(crate) fn assign_lights_to_clusters( let is_orthographic = camera.projection_matrix.w_axis.w == 1.0; let far_z = match config.far_z_mode() { - ClusterFarZMode::CameraFarPlane => camera.far, ClusterFarZMode::MaxLightRange => { let inverse_view_row_2 = inverse_view_transform.row(2); lights @@ -772,7 +769,17 @@ pub(crate) fn assign_lights_to_clusters( ClusterFarZMode::Constant(far) => far, }; let first_slice_depth = match (is_orthographic, requested_cluster_dimensions.z) { - (true, _) => camera.near, + (true, _) => { + // NOTE: Based on glam's Mat4::orthographic_rh(), as used to calculate the orthographic projection + // matrix, we can calculate the projection's view-space near plane as follows: + // component 3,2 = r * near and 2,2 = r where r = 1.0 / (near - far) + // There is a caveat here that when calculating the projection matrix, near and far were swapped to give + // reversed z, consistent with the perspective projection. So, + // 3,2 = r * far and 2,2 = r where r = 1.0 / (far - near) + // rearranging r = 1.0 / (far - near), r * (far - near) = 1.0, r * far - 1.0 = r * near, near = (r * far - 1.0) / r + // = (3,2 - 1.0) / 2,2 + (camera.projection_matrix.w_axis.z - 1.0) / camera.projection_matrix.z_axis.z + } (false, 1) => config.first_slice_depth().max(far_z), _ => config.first_slice_depth(), }; diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 9fc57c640d4f9..f4b7c5aeddeab 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -74,8 +74,6 @@ pub struct ExtractedDirectionalLight { shadows_enabled: bool, shadow_depth_bias: f32, shadow_normal_bias: f32, - near: f32, - far: f32, } pub type ExtractedDirectionalLightShadowMap = DirectionalLightShadowMap; @@ -513,8 +511,6 @@ pub fn extract_lights( shadow_normal_bias: directional_light.shadow_normal_bias * directional_light_texel_size * std::f32::consts::SQRT_2, - near: directional_light.shadow_projection.near, - far: directional_light.shadow_projection.far, }, render_visible_entities, )); @@ -861,8 +857,6 @@ pub fn prepare_lights( height: point_light_shadow_map.size as u32, transform: view_translation * *view_rotation, projection: cube_face_projection, - near: POINT_LIGHT_NEAR_Z, - far: light.range, }, RenderPhase::::default(), LightEntity::Point { @@ -946,8 +940,6 @@ pub fn prepare_lights( height: directional_light_shadow_map.size as u32, transform: GlobalTransform::from_matrix(view.inverse()), projection, - near: light.near, - far: light.far, }, RenderPhase::::default(), LightEntity::Directional { light_entity }, diff --git a/crates/bevy_pbr/src/render/mesh_view_bind_group.wgsl b/crates/bevy_pbr/src/render/mesh_view_bind_group.wgsl index 581334676f2cd..54dd56c967a16 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bind_group.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_bind_group.wgsl @@ -6,8 +6,6 @@ struct View { inverse_view: mat4x4; projection: mat4x4; world_position: vec3; - near: f32; - far: f32; width: f32; height: f32; }; diff --git a/crates/bevy_render/src/camera/bundle.rs b/crates/bevy_render/src/camera/bundle.rs index fa36f7a8a74d0..39bda7802bbd8 100644 --- a/crates/bevy_render/src/camera/bundle.rs +++ b/crates/bevy_render/src/camera/bundle.rs @@ -55,11 +55,7 @@ impl PerspectiveCameraBundle { perspective_projection.far(), ); PerspectiveCameraBundle { - camera: Camera { - near: perspective_projection.near, - far: perspective_projection.far, - ..Default::default() - }, + camera: Camera::default(), perspective_projection, visible_entities: VisibleEntities::default(), frustum, @@ -99,11 +95,7 @@ impl OrthographicCameraBundle { orthographic_projection.far(), ); OrthographicCameraBundle { - camera: Camera { - near: orthographic_projection.near, - far: orthographic_projection.far, - ..Default::default() - }, + camera: Camera::default(), orthographic_projection, visible_entities: VisibleEntities::default(), frustum, @@ -160,11 +152,7 @@ impl OrthographicCameraBundle { orthographic_projection.far(), ); OrthographicCameraBundle { - camera: Camera { - near: orthographic_projection.near, - far: orthographic_projection.far, - ..Default::default() - }, + camera: Camera::default(), orthographic_projection, visible_entities: VisibleEntities::default(), frustum, diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index 2cbec6a0e0a79..852f3553649fe 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -36,8 +36,6 @@ pub struct Camera { pub target: RenderTarget, #[reflect(ignore)] pub depth_calculation: DepthCalculation, - pub near: f32, - pub far: f32, } #[derive(Debug, Clone, Reflect, PartialEq, Eq, Hash)] @@ -333,8 +331,6 @@ pub fn extract_cameras( transform: *transform, width: size.x, height: size.y, - near: camera.near, - far: camera.far, }, visible_entities.clone(), M::default(), diff --git a/crates/bevy_render/src/view/mod.rs b/crates/bevy_render/src/view/mod.rs index e6760974b78cf..f5e547b0f8716 100644 --- a/crates/bevy_render/src/view/mod.rs +++ b/crates/bevy_render/src/view/mod.rs @@ -81,8 +81,6 @@ pub struct ExtractedView { pub transform: GlobalTransform, pub width: u32, pub height: u32, - pub near: f32, - pub far: f32, } #[derive(Clone, AsStd140)] @@ -92,8 +90,6 @@ pub struct ViewUniform { inverse_view: Mat4, projection: Mat4, world_position: Vec3, - near: f32, - far: f32, width: f32, height: f32, } @@ -157,8 +153,6 @@ fn prepare_view_uniforms( inverse_view, projection, world_position: camera.transform.translation, - near: camera.near, - far: camera.far, width: camera.width as f32, height: camera.height as f32, }), diff --git a/crates/bevy_sprite/src/mesh2d/mesh2d_view_bind_group.wgsl b/crates/bevy_sprite/src/mesh2d/mesh2d_view_bind_group.wgsl index 53b5513f6b311..b85d542fc0e0f 100644 --- a/crates/bevy_sprite/src/mesh2d/mesh2d_view_bind_group.wgsl +++ b/crates/bevy_sprite/src/mesh2d/mesh2d_view_bind_group.wgsl @@ -6,8 +6,6 @@ struct View { inverse_view: mat4x4; projection: mat4x4; world_position: vec3; - near: f32; - far: f32; width: f32; height: f32; }; diff --git a/examples/tools/scene_viewer.rs b/examples/tools/scene_viewer.rs index 1dbcc115fd62c..7032cb0637d08 100644 --- a/examples/tools/scene_viewer.rs +++ b/examples/tools/scene_viewer.rs @@ -293,13 +293,7 @@ fn camera_spawn_check( &transform.back(), perspective_projection.far(), ); - let camera = Camera { - near: perspective_projection.near, - far: perspective_projection.far, - ..default() - }; PerspectiveCameraBundle { - camera, perspective_projection, frustum, transform,