use bevy::{ asset::LoadState, prelude::*, reflect::TypePath, render::render_resource::{AsBindGroup, ShaderRef}, }; /// This example illustrates how to create a texture for use with a `texture_2d_array` shader /// uniform variable. fn main() { App::new() .add_plugins(( DefaultPlugins, MaterialPlugin::::default(), )) .add_systems(Startup, setup) .add_systems(Update, create_array_texture) .run(); } #[derive(Resource)] struct LoadingTexture { is_loaded: bool, handle: Handle, } fn setup(mut commands: Commands, asset_server: Res) { // Start loading the texture. commands.insert_resource(LoadingTexture { is_loaded: false, handle: asset_server.load("textures/array_texture.png"), }); // light commands.spawn(PointLightBundle { point_light: PointLight { intensity: 150_000.0, ..Default::default() }, transform: Transform::from_xyz(-3.0, 2.0, -1.0), ..Default::default() }); commands.spawn(PointLightBundle { point_light: PointLight { intensity: 150_000.0, ..Default::default() }, transform: Transform::from_xyz(3.0, 2.0, 1.0), ..Default::default() }); // camera commands.spawn(Camera3dBundle { transform: Transform::from_xyz(5.0, 5.0, 5.0).looking_at(Vec3::new(1.5, 0.0, 0.0), Vec3::Y), ..Default::default() }); } fn create_array_texture( mut commands: Commands, asset_server: Res, mut loading_texture: ResMut, mut images: ResMut>, mut meshes: ResMut>, mut materials: ResMut>, ) { if loading_texture.is_loaded || asset_server.load_state(loading_texture.handle.clone()) != LoadState::Loaded { return; } loading_texture.is_loaded = true; let image = images.get_mut(&loading_texture.handle).unwrap(); // Create a new array texture asset from the loaded texture. let array_layers = 4; image.reinterpret_stacked_2d_as_array(array_layers); // Spawn some cubes using the array texture let mesh_handle = meshes.add(shape::Cube { size: 1.0 }); let material_handle = materials.add(ArrayTextureMaterial { array_texture: loading_texture.handle.clone(), }); for x in -5..=5 { commands.spawn(MaterialMeshBundle { mesh: mesh_handle.clone(), material: material_handle.clone(), transform: Transform::from_xyz(x as f32 + 0.5, 0.0, 0.0), ..Default::default() }); } } #[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] struct ArrayTextureMaterial { #[texture(0, dimension = "2d_array")] #[sampler(1)] array_texture: Handle, } impl Material for ArrayTextureMaterial { fn fragment_shader() -> ShaderRef { "shaders/array_texture.wgsl".into() } }