1import bevy_render::bindless::{bindless_samplers_filtering, bindless_textures_2d}; 4 prepass::io::VertexOutput, 5 prepass::bindings::previous_view_uniforms, 8 mesh_view_bindings::view, 15import package::render::pbr_bindings::material_indices; 18const PREMULTIPLIED_ALPHA_CUTOFF = 0.05; 22fn prepass_alpha_discard(material_flags: u32, alpha_cutoff: f32, output_color: vec4<f32>) { 23 let alpha_mode = material_flags & pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS; 24 if alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_MASK { 25 if output_color.a < alpha_cutoff { 28 } else if (alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_BLEND || 29 alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_ADD || 30 alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_ALPHA_TO_COVERAGE) { 31 if output_color.a < PREMULTIPLIED_ALPHA_CUTOFF { 34 } else if alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_PREMULTIPLIED { 35 if all(output_color < vec4(PREMULTIPLIED_ALPHA_CUTOFF)) { 43fn prepass_sample_color_and_alpha_discard(in: VertexOutput) { 47 let slot = mesh[in.instance_index].material_and_lightmap_bind_group_slot & 0xffffu; 48 var output_color: vec4<f32> = pbr_bindings::material_array[material_indices[slot].material].base_color; 49 let flags = pbr_bindings::material_array[material_indices[slot].material].flags; 50 let alpha_cutoff = pbr_bindings::material_array[material_indices[slot].material].alpha_cutoff; 53 var output_color: vec4<f32> = pbr_bindings::material.base_color; 54 let flags = pbr_bindings::material.flags; 55 let alpha_cutoff = pbr_bindings::material.alpha_cutoff; 59@if(STANDARD_MATERIAL_BASE_COLOR_UV_B) 65 let uv_transform = pbr_bindings::material_array[material_indices[slot].material].uv_transform; 67 let uv_transform = pbr_bindings::material.uv_transform; 69 uv = (uv_transform * vec3(uv, 1.0)).xy; 70 if (flags & pbr_types::STANDARD_MATERIAL_FLAGS_BASE_COLOR_TEXTURE_BIT) != 0u { 72 let texture = bindless_textures_2d[material_indices[slot].base_color_texture]; 74 let texture = pbr_bindings::base_color_texture; 76 let sampler_ = bindless_samplers_filtering[material_indices[slot].base_color_sampler]; 78 let sampler_ = pbr_bindings::base_color_sampler; 79 output_color = output_color * textureSampleBias( 88 prepass_alpha_discard(flags, alpha_cutoff, output_color); 92@if(MOTION_VECTOR_PREPASS) 93fn calculate_motion_vector(world_position: vec4<f32>, previous_world_position: vec4<f32>) -> vec2<f32> { 94 let clip_position_t = view.unjittered_clip_from_world * world_position; 95 let clip_position = clip_position_t.xy / clip_position_t.w; 96 let previous_clip_position_t = previous_view_uniforms.unjittered_clip_from_world * previous_world_position; 97 let previous_clip_position = previous_clip_position_t.xy / previous_clip_position_t.w; 104 return (clip_position - previous_clip_position) * vec2(0.5, -0.5);