//! A shader and a material that uses it. use bevy::{ prelude::*, reflect::TypePath, render::render_resource::{AsBindGroup, ShaderRef}, sprite::{Material2d, Material2dPlugin}, }; /// This example uses a shader source file from the assets subdirectory const SHADER_ASSET_PATH: &str = "shaders/custom_material_2d.wgsl"; 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(Camera2d); // quad commands.spawn(( Mesh2d(meshes.add(Rectangle::default())), MeshMaterial2d(materials.add(CustomMaterial { color: LinearRgba::BLUE, color_texture: Some(asset_server.load("branding/icon.png")), })), Transform::default().with_scale(Vec3::splat(128.)), )); } // 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 { SHADER_ASSET_PATH.into() } }