use bevy::pbr::OpaqueRendererMethod; use bevy::prelude::*; use bevy::pbr::ExtendedMaterial; use bevy::pbr::MaterialExtension; use bevy::pbr::MaterialMeshBundle; use bevy::render::render_resource::*; type MyMat = ExtendedMaterial; fn main() { App::new() .add_plugins(( DefaultPlugins.set(ImagePlugin::default_nearest()), MaterialPlugin::::default(), )) .add_systems(Startup, setup) .add_systems(Update, rotate) .run(); } fn setup( mut commands: Commands, mut meshes: ResMut>, mut materials: ResMut>, ) { commands.spawn(MaterialMeshBundle { mesh: meshes.add( Mesh::try_from(shape::Box { ..default() }).unwrap(), ), transform: Transform::from_xyz(0.0, 0.5, 0.0), material: materials.add(ExtendedMaterial { base: StandardMaterial { base_color: Color::RED, opaque_render_method: OpaqueRendererMethod::Auto, alpha_mode: AlphaMode::Mask(0.5), ..default() }, extension: MatExt { cutoff: 0.5 }, }), ..default() }); commands.spawn(PointLightBundle { point_light: PointLight { intensity: 10.0, ..default() }, transform: Transform::from_xyz(-1.0, 4.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); commands.spawn(Camera3dBundle { transform: Transform::from_xyz(-1.0, 1.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y), ..default() }); } #[derive(Asset, AsBindGroup, Reflect, Debug, Clone)] struct MatExt { #[uniform(100)] cutoff: f32, } impl MaterialExtension for MatExt { fn fragment_shader() -> ShaderRef { "examples/shaders/dissolve.wgsl".into() } } fn rotate( mut query: Query<&mut Transform, With>>, time: Res