diff --git a/crates/bevy_pbr/src/render/mesh_view_types.wgsl b/crates/bevy_pbr/src/render/mesh_view_types.wgsl index 3892cdefb46dc..31d3cdebb275c 100644 --- a/crates/bevy_pbr/src/render/mesh_view_types.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_types.wgsl @@ -2,9 +2,11 @@ struct View { view_proj: mat4x4; + inverse_view_proj: mat4x4; view: mat4x4; inverse_view: mat4x4; projection: mat4x4; + inverse_projection: mat4x4; world_position: vec3; width: f32; height: f32; diff --git a/crates/bevy_render/src/view/mod.rs b/crates/bevy_render/src/view/mod.rs index 2638e94d4581a..35bd213bfd9b3 100644 --- a/crates/bevy_render/src/view/mod.rs +++ b/crates/bevy_render/src/view/mod.rs @@ -84,9 +84,11 @@ pub struct ExtractedView { #[derive(Clone, ShaderType)] pub struct ViewUniform { view_proj: Mat4, + inverse_view_proj: Mat4, view: Mat4, inverse_view: Mat4, projection: Mat4, + inverse_projection: Mat4, world_position: Vec3, width: f32, height: f32, @@ -138,14 +140,17 @@ fn prepare_view_uniforms( view_uniforms.uniforms.clear(); for (entity, camera) in views.iter() { let projection = camera.projection; + let inverse_projection = projection.inverse(); let view = camera.transform.compute_matrix(); let inverse_view = view.inverse(); let view_uniforms = ViewUniformOffset { offset: view_uniforms.uniforms.push(ViewUniform { view_proj: projection * inverse_view, + inverse_view_proj: view * inverse_projection, view, inverse_view, projection, + inverse_projection, world_position: camera.transform.translation, width: camera.width as f32, height: camera.height as f32,