From 19fac34b28085dce457df25ab4e1a4b94230da66 Mon Sep 17 00:00:00 2001 From: Elijah Date: Mon, 4 Jul 2022 21:04:16 +0800 Subject: [PATCH] Add `inverse_projection` and `inverse_view_proj` fields to shader view uniform (#5119) # Objective Transform screen-space coordinates into world space in shaders. (My use case is for generating rays for ray tracing with the same perspective as the 3d camera). ## Solution Add `inverse_projection` and `inverse_view_proj` fields to shader view uniform --- ## Changelog ### Added `inverse_projection` and `inverse_view_proj` fields to shader view uniform ## Note It'd probably be good to double-check that I did the matrix multiplication in the right order for `inverse_proj_view`. Thanks! --- crates/bevy_pbr/src/render/mesh_view_types.wgsl | 2 ++ crates/bevy_render/src/view/mod.rs | 5 +++++ 2 files changed, 7 insertions(+) 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,