#import bevy_pbr::forward_io::VertexOutput #import bevy_pbr::mesh_bindings::mesh #import bevy_render::bindless::{bindless_samplers_filtering, bindless_textures_2d} struct Color { base_color: vec4, } // This structure is a mapping from bindless index to the index in the // appropriate slab struct MaterialBindings { material: u32, // 0 color_texture: u32, // 1 color_texture_sampler: u32, // 2 } #ifdef BINDLESS @group(3) @binding(0) var materials: array; @group(3) @binding(10) var material_color: binding_array; #else // BINDLESS @group(3) @binding(0) var material_color: Color; @group(3) @binding(1) var material_color_texture: texture_2d; @group(3) @binding(2) var material_color_sampler: sampler; #endif // BINDLESS @fragment fn fragment(in: VertexOutput) -> @location(0) vec4 { #ifdef BINDLESS let slot = mesh[in.instance_index].material_and_lightmap_bind_group_slot & 0xffffu; let base_color = material_color[materials[slot].material].base_color; #else // BINDLESS let base_color = material_color.base_color; #endif // BINDLESS return base_color * textureSampleLevel( #ifdef BINDLESS bindless_textures_2d[materials[slot].color_texture], bindless_samplers_filtering[materials[slot].color_texture_sampler], #else // BINDLESS material_color_texture, material_color_sampler, #endif // BINDLESS in.uv, 0.0 ); }