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!
This commit is contained in:
parent
46f5411605
commit
5d3fa5e77b
@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
struct View {
|
struct View {
|
||||||
view_proj: mat4x4<f32>;
|
view_proj: mat4x4<f32>;
|
||||||
|
inverse_view_proj: mat4x4<f32>;
|
||||||
view: mat4x4<f32>;
|
view: mat4x4<f32>;
|
||||||
inverse_view: mat4x4<f32>;
|
inverse_view: mat4x4<f32>;
|
||||||
projection: mat4x4<f32>;
|
projection: mat4x4<f32>;
|
||||||
|
inverse_projection: mat4x4<f32>;
|
||||||
world_position: vec3<f32>;
|
world_position: vec3<f32>;
|
||||||
width: f32;
|
width: f32;
|
||||||
height: f32;
|
height: f32;
|
||||||
|
|||||||
@ -84,9 +84,11 @@ pub struct ExtractedView {
|
|||||||
#[derive(Clone, ShaderType)]
|
#[derive(Clone, ShaderType)]
|
||||||
pub struct ViewUniform {
|
pub struct ViewUniform {
|
||||||
view_proj: Mat4,
|
view_proj: Mat4,
|
||||||
|
inverse_view_proj: Mat4,
|
||||||
view: Mat4,
|
view: Mat4,
|
||||||
inverse_view: Mat4,
|
inverse_view: Mat4,
|
||||||
projection: Mat4,
|
projection: Mat4,
|
||||||
|
inverse_projection: Mat4,
|
||||||
world_position: Vec3,
|
world_position: Vec3,
|
||||||
width: f32,
|
width: f32,
|
||||||
height: f32,
|
height: f32,
|
||||||
@ -138,14 +140,17 @@ fn prepare_view_uniforms(
|
|||||||
view_uniforms.uniforms.clear();
|
view_uniforms.uniforms.clear();
|
||||||
for (entity, camera) in views.iter() {
|
for (entity, camera) in views.iter() {
|
||||||
let projection = camera.projection;
|
let projection = camera.projection;
|
||||||
|
let inverse_projection = projection.inverse();
|
||||||
let view = camera.transform.compute_matrix();
|
let view = camera.transform.compute_matrix();
|
||||||
let inverse_view = view.inverse();
|
let inverse_view = view.inverse();
|
||||||
let view_uniforms = ViewUniformOffset {
|
let view_uniforms = ViewUniformOffset {
|
||||||
offset: view_uniforms.uniforms.push(ViewUniform {
|
offset: view_uniforms.uniforms.push(ViewUniform {
|
||||||
view_proj: projection * inverse_view,
|
view_proj: projection * inverse_view,
|
||||||
|
inverse_view_proj: view * inverse_projection,
|
||||||
view,
|
view,
|
||||||
inverse_view,
|
inverse_view,
|
||||||
projection,
|
projection,
|
||||||
|
inverse_projection,
|
||||||
world_position: camera.transform.translation,
|
world_position: camera.transform.translation,
|
||||||
width: camera.width as f32,
|
width: camera.width as f32,
|
||||||
height: camera.height as f32,
|
height: camera.height as f32,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user