Skip to content

Commit

Permalink
Fixing confusing near and far fields in Camera (#4457)
Browse files Browse the repository at this point in the history
# 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`
  • Loading branch information
AronDerenyi committed May 16, 2022
1 parent 1ba7429 commit 2e8dfc0
Show file tree
Hide file tree
Showing 10 changed files with 14 additions and 53 deletions.
2 changes: 0 additions & 2 deletions assets/shaders/custom_material.vert
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down
4 changes: 0 additions & 4 deletions crates/bevy_gltf/src/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
15 changes: 11 additions & 4 deletions crates/bevy_pbr/src/light.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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(),
};
Expand Down
8 changes: 0 additions & 8 deletions crates/bevy_pbr/src/render/light.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
));
Expand Down Expand Up @@ -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::<Shadow>::default(),
LightEntity::Point {
Expand Down Expand Up @@ -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::<Shadow>::default(),
LightEntity::Directional { light_entity },
Expand Down
2 changes: 0 additions & 2 deletions crates/bevy_pbr/src/render/mesh_view_bind_group.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ struct View {
inverse_view: mat4x4<f32>;
projection: mat4x4<f32>;
world_position: vec3<f32>;
near: f32;
far: f32;
width: f32;
height: f32;
};
Expand Down
18 changes: 3 additions & 15 deletions crates/bevy_render/src/camera/bundle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,7 @@ impl<M: Component + Default> PerspectiveCameraBundle<M> {
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,
Expand Down Expand Up @@ -99,11 +95,7 @@ impl OrthographicCameraBundle<Camera3d> {
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,
Expand Down Expand Up @@ -160,11 +152,7 @@ impl OrthographicCameraBundle<Camera2d> {
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,
Expand Down
4 changes: 0 additions & 4 deletions crates/bevy_render/src/camera/camera.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -333,8 +331,6 @@ pub fn extract_cameras<M: Component + Default>(
transform: *transform,
width: size.x,
height: size.y,
near: camera.near,
far: camera.far,
},
visible_entities.clone(),
M::default(),
Expand Down
6 changes: 0 additions & 6 deletions crates/bevy_render/src/view/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand All @@ -92,8 +90,6 @@ pub struct ViewUniform {
inverse_view: Mat4,
projection: Mat4,
world_position: Vec3,
near: f32,
far: f32,
width: f32,
height: f32,
}
Expand Down Expand Up @@ -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,
}),
Expand Down
2 changes: 0 additions & 2 deletions crates/bevy_sprite/src/mesh2d/mesh2d_view_bind_group.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ struct View {
inverse_view: mat4x4<f32>;
projection: mat4x4<f32>;
world_position: vec3<f32>;
near: f32;
far: f32;
width: f32;
height: f32;
};
6 changes: 0 additions & 6 deletions examples/tools/scene_viewer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 2e8dfc0

Please sign in to comment.