1#define_import_path bevy_pbr::view_transformations 3#import bevy_pbr::mesh_view_bindings as view_bindings 4#import bevy_pbr::prepass_bindings 38fn position_view_to_world(view_pos: vec3<f32>) -> vec3<f32> { 39 let world_pos = view_bindings::view.world_from_view * vec4(view_pos, 1.0); 44fn position_clip_to_world(clip_pos: vec4<f32>) -> vec3<f32> { 45 let world_pos = view_bindings::view.world_from_clip * clip_pos; 50fn position_ndc_to_world(ndc_pos: vec3<f32>) -> vec3<f32> { 51 let world_pos = view_bindings::view.world_from_clip * vec4(ndc_pos, 1.0); 52 return world_pos.xyz / world_pos.w; 56fn direction_view_to_world(view_dir: vec3<f32>) -> vec3<f32> { 57 let world_dir = view_bindings::view.world_from_view * vec4(view_dir, 0.0); 62fn direction_clip_to_world(clip_dir: vec4<f32>) -> vec3<f32> { 63 let world_dir = view_bindings::view.world_from_clip * clip_dir; 72fn position_world_to_view(world_pos: vec3<f32>) -> vec3<f32> { 73 let view_pos = view_bindings::view.view_from_world * vec4(world_pos, 1.0); 78fn position_clip_to_view(clip_pos: vec4<f32>) -> vec3<f32> { 79 let view_pos = view_bindings::view.view_from_clip * clip_pos; 84fn position_ndc_to_view(ndc_pos: vec3<f32>) -> vec3<f32> { 85 let view_pos = view_bindings::view.view_from_clip * vec4(ndc_pos, 1.0); 86 return view_pos.xyz / view_pos.w; 90fn direction_world_to_view(world_dir: vec3<f32>) -> vec3<f32> { 91 let view_dir = view_bindings::view.view_from_world * vec4(world_dir, 0.0); 96fn direction_clip_to_view(clip_dir: vec4<f32>) -> vec3<f32> { 97 let view_dir = view_bindings::view.view_from_clip * clip_dir; 105fn position_world_to_prev_view(world_pos: vec3<f32>) -> vec3<f32> { 106 let view_pos = prepass_bindings::previous_view_uniforms.view_from_world * 107 vec4(world_pos, 1.0); 111fn position_world_to_prev_ndc(world_pos: vec3<f32>) -> vec3<f32> { 112 let ndc_pos = prepass_bindings::previous_view_uniforms.clip_from_world * 113 vec4(world_pos, 1.0); 114 return ndc_pos.xyz / ndc_pos.w; 122fn position_world_to_clip(world_pos: vec3<f32>) -> vec4<f32> { 123 let clip_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 128fn position_view_to_clip(view_pos: vec3<f32>) -> vec4<f32> { 129 let clip_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 134fn direction_world_to_clip(world_dir: vec3<f32>) -> vec4<f32> { 135 let clip_dir = view_bindings::view.clip_from_world * vec4(world_dir, 0.0); 140fn direction_view_to_clip(view_dir: vec3<f32>) -> vec4<f32> { 141 let clip_dir = view_bindings::view.clip_from_view * vec4(view_dir, 0.0); 150fn position_world_to_ndc(world_pos: vec3<f32>) -> vec3<f32> { 151 let ndc_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 152 return ndc_pos.xyz / ndc_pos.w; 156fn position_view_to_ndc(view_pos: vec3<f32>) -> vec3<f32> { 157 let ndc_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 158 return ndc_pos.xyz / ndc_pos.w; 166fn perspective_camera_near() -> f32 { 167 return view_bindings::view.clip_from_view[3][2]; 172fn depth_ndc_to_view_z(ndc_depth: f32) -> f32 { 173#ifdef VIEW_PROJECTION_PERSPECTIVE 174 return -perspective_camera_near() / ndc_depth; 175#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 176 return -(view_bindings::view.clip_from_view[3][2] - ndc_depth) / view_bindings::view.clip_from_view[2][2]; 178 let view_pos = view_bindings::view.view_from_clip * vec4(0.0, 0.0, ndc_depth, 1.0); 179 return view_pos.z / view_pos.w; 185fn view_z_to_depth_ndc(view_z: f32) -> f32 { 186#ifdef VIEW_PROJECTION_PERSPECTIVE 187 return -perspective_camera_near() / view_z; 188#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 189 return view_bindings::view.clip_from_view[3][2] + view_z * view_bindings::view.clip_from_view[2][2]; 191 let ndc_pos = view_bindings::view.clip_from_view * vec4(0.0, 0.0, view_z, 1.0); 192 return ndc_pos.z / ndc_pos.w; 196fn prev_view_z_to_depth_ndc(view_z: f32) -> f32 { 197#ifdef VIEW_PROJECTION_PERSPECTIVE 198 return -perspective_camera_near() / view_z; 199#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 200 return prepass_bindings::previous_view_uniforms.clip_from_view[3][2] + 201 view_z * prepass_bindings::previous_view_uniforms.clip_from_view[2][2]; 203 let ndc_pos = prepass_bindings::previous_view_uniforms.clip_from_view * 204 vec4(0.0, 0.0, view_z, 1.0); 205 return ndc_pos.z / ndc_pos.w; 214fn ndc_to_uv(ndc: vec2<f32>) -> vec2<f32> { 215 return ndc * vec2(0.5, -0.5) + vec2(0.5); 219fn uv_to_ndc(uv: vec2<f32>) -> vec2<f32> { 220 return uv * vec2(2.0, -2.0) + vec2(-1.0, 1.0); 225fn frag_coord_to_uv(frag_coord: vec2<f32>) -> vec2<f32> { 226 return (frag_coord - view_bindings::view.viewport.xy) / view_bindings::view.viewport.zw; 230fn frag_coord_to_ndc(frag_coord: vec4<f32>) -> vec3<f32> { 231 return vec3(uv_to_ndc(frag_coord_to_uv(frag_coord.xy)), frag_coord.z); 236fn ndc_to_frag_coord(ndc: vec2<f32>) -> vec2<f32> { 237 return ndc_to_uv(ndc) * view_bindings::view.viewport.zw;