1#define_import_path bevy_pbr::view_transformations 3#import bevy_pbr::mesh_view_bindings as view_bindings 4#import bevy_pbr::prepass_bindings 34fn position_view_to_world(view_pos: vec3<f32>) -> vec3<f32> { 35 let world_pos = view_bindings::view.world_from_view * vec4(view_pos, 1.0); 40fn position_clip_to_world(clip_pos: vec4<f32>) -> vec3<f32> { 41 let world_pos = view_bindings::view.world_from_clip * clip_pos; 46fn position_ndc_to_world(ndc_pos: vec3<f32>) -> vec3<f32> { 47 let world_pos = view_bindings::view.world_from_clip * vec4(ndc_pos, 1.0); 48 return world_pos.xyz / world_pos.w; 52fn direction_view_to_world(view_dir: vec3<f32>) -> vec3<f32> { 53 let world_dir = view_bindings::view.world_from_view * vec4(view_dir, 0.0); 58fn direction_clip_to_world(clip_dir: vec4<f32>) -> vec3<f32> { 59 let world_dir = view_bindings::view.world_from_clip * clip_dir; 68fn position_world_to_view(world_pos: vec3<f32>) -> vec3<f32> { 69 let view_pos = view_bindings::view.view_from_world * vec4(world_pos, 1.0); 74fn position_clip_to_view(clip_pos: vec4<f32>) -> vec3<f32> { 75 let view_pos = view_bindings::view.view_from_clip * clip_pos; 80fn position_ndc_to_view(ndc_pos: vec3<f32>) -> vec3<f32> { 81 let view_pos = view_bindings::view.view_from_clip * vec4(ndc_pos, 1.0); 82 return view_pos.xyz / view_pos.w; 86fn direction_world_to_view(world_dir: vec3<f32>) -> vec3<f32> { 87 let view_dir = view_bindings::view.view_from_world * vec4(world_dir, 0.0); 92fn direction_clip_to_view(clip_dir: vec4<f32>) -> vec3<f32> { 93 let view_dir = view_bindings::view.view_from_clip * clip_dir; 101fn position_world_to_prev_view(world_pos: vec3<f32>) -> vec3<f32> { 102 let view_pos = prepass_bindings::previous_view_uniforms.view_from_world * 103 vec4(world_pos, 1.0); 107fn position_world_to_prev_ndc(world_pos: vec3<f32>) -> vec3<f32> { 108 let ndc_pos = prepass_bindings::previous_view_uniforms.clip_from_world * 109 vec4(world_pos, 1.0); 110 return ndc_pos.xyz / ndc_pos.w; 118fn position_world_to_clip(world_pos: vec3<f32>) -> vec4<f32> { 119 let clip_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 124fn position_view_to_clip(view_pos: vec3<f32>) -> vec4<f32> { 125 let clip_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 130fn direction_world_to_clip(world_dir: vec3<f32>) -> vec4<f32> { 131 let clip_dir = view_bindings::view.clip_from_world * vec4(world_dir, 0.0); 136fn direction_view_to_clip(view_dir: vec3<f32>) -> vec4<f32> { 137 let clip_dir = view_bindings::view.clip_from_view * vec4(view_dir, 0.0); 146fn position_world_to_ndc(world_pos: vec3<f32>) -> vec3<f32> { 147 let ndc_pos = view_bindings::view.clip_from_world * vec4(world_pos, 1.0); 148 return ndc_pos.xyz / ndc_pos.w; 152fn position_view_to_ndc(view_pos: vec3<f32>) -> vec3<f32> { 153 let ndc_pos = view_bindings::view.clip_from_view * vec4(view_pos, 1.0); 154 return ndc_pos.xyz / ndc_pos.w; 162fn perspective_camera_near() -> f32 { 163 return view_bindings::view.clip_from_view[3][2]; 168fn depth_ndc_to_view_z(ndc_depth: f32) -> f32 { 169#ifdef VIEW_PROJECTION_PERSPECTIVE 170 return -perspective_camera_near() / ndc_depth; 171#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 172 return -(view_bindings::view.clip_from_view[3][2] - ndc_depth) / view_bindings::view.clip_from_view[2][2]; 174 let view_pos = view_bindings::view.view_from_clip * vec4(0.0, 0.0, ndc_depth, 1.0); 175 return view_pos.z / view_pos.w; 181fn view_z_to_depth_ndc(view_z: f32) -> f32 { 182#ifdef VIEW_PROJECTION_PERSPECTIVE 183 return -perspective_camera_near() / view_z; 184#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 185 return view_bindings::view.clip_from_view[3][2] + view_z * view_bindings::view.clip_from_view[2][2]; 187 let ndc_pos = view_bindings::view.clip_from_view * vec4(0.0, 0.0, view_z, 1.0); 188 return ndc_pos.z / ndc_pos.w; 192fn prev_view_z_to_depth_ndc(view_z: f32) -> f32 { 193#ifdef VIEW_PROJECTION_PERSPECTIVE 194 return -perspective_camera_near() / view_z; 195#else ifdef VIEW_PROJECTION_ORTHOGRAPHIC 196 return prepass_bindings::previous_view_uniforms.clip_from_view[3][2] + 197 view_z * prepass_bindings::previous_view_uniforms.clip_from_view[2][2]; 199 let ndc_pos = prepass_bindings::previous_view_uniforms.clip_from_view * 200 vec4(0.0, 0.0, view_z, 1.0); 201 return ndc_pos.z / ndc_pos.w; 210fn ndc_to_uv(ndc: vec2<f32>) -> vec2<f32> { 211 return ndc * vec2(0.5, -0.5) + vec2(0.5); 215fn uv_to_ndc(uv: vec2<f32>) -> vec2<f32> { 216 return uv * vec2(2.0, -2.0) + vec2(-1.0, 1.0); 221fn frag_coord_to_uv(frag_coord: vec2<f32>) -> vec2<f32> { 222 return (frag_coord - view_bindings::view.viewport.xy) / view_bindings::view.viewport.zw; 226fn frag_coord_to_ndc(frag_coord: vec4<f32>) -> vec3<f32> { 227 return vec3(uv_to_ndc(frag_coord_to_uv(frag_coord.xy)), frag_coord.z); 232fn ndc_to_frag_coord(ndc: vec2<f32>) -> vec2<f32> { 233 return ndc_to_uv(ndc) * view_bindings::view.viewport.zw;