Skip to content

Commit

Permalink
Add inverse_projection and inverse_view_proj fields to shader vie…
Browse files Browse the repository at this point in the history
…w 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!
  • Loading branch information
elijaharita committed Jul 4, 2022
1 parent 46f5411 commit 5d3fa5e
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 0 deletions.
2 changes: 2 additions & 0 deletions crates/bevy_pbr/src/render/mesh_view_types.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

struct View {
view_proj: mat4x4<f32>;
inverse_view_proj: mat4x4<f32>;
view: mat4x4<f32>;
inverse_view: mat4x4<f32>;
projection: mat4x4<f32>;
inverse_projection: mat4x4<f32>;
world_position: vec3<f32>;
width: f32;
height: f32;
Expand Down
5 changes: 5 additions & 0 deletions crates/bevy_render/src/view/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 5d3fa5e

Please sign in to comment.