//! A shader and a material that uses it. use bevy::{ prelude::*, reflect::TypePath, render::render_resource::{AsBindGroup, ShaderRef}, sprite::{Material2d, Material2dPlugin, MaterialMesh2dBundle}, }; fn main() { App::new() .add_plugins(( DefaultPlugins, Material2dPlugin::::default(), )) .add_systems(Startup, setup) .run(); } // Setup a simple 2d scene fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, asset_server: Res, ) { // camera commands.spawn(Camera2dBundle::default()); // quad commands.spawn(MaterialMesh2dBundle { mesh: meshes.add(Rectangle::default()).into(), transform: Transform::default().with_scale(Vec3::splat(128.)), material: materials.add(CustomMaterial { color: LinearRgba::BLUE, color_texture: Some(asset_server.load("branding/icon.png")), }), ..default() }); } // This is the struct that will be passed to your shader #[derive(Asset, TypePath, AsBindGroup, Debug, Clone)] struct CustomMaterial { #[uniform(0)] color: LinearRgba, #[texture(1)] #[sampler(2)] color_texture: Option>, } /// The Material2d trait is very configurable, but comes with sensible defaults for all methods. /// You only need to implement functions for features that need non-default behavior. See the Material2d api docs for details! impl Material2d for CustomMaterial { fn fragment_shader() -> ShaderRef { "shaders/custom_material_2d.wgsl".into() } }