Path: blob/main/examples/shader/shader_material_screenspace_texture.rs
6595 views
//! A shader that samples a texture with view-independent UV coordinates.12use bevy::{3prelude::*, reflect::TypePath, render::render_resource::AsBindGroup, shader::ShaderRef,4};56/// This example uses a shader source file from the assets subdirectory7const SHADER_ASSET_PATH: &str = "shaders/custom_material_screenspace_texture.wgsl";89fn main() {10App::new()11.add_plugins((DefaultPlugins, MaterialPlugin::<CustomMaterial>::default()))12.add_systems(Startup, setup)13.add_systems(Update, rotate_camera)14.run();15}1617#[derive(Component)]18struct MainCamera;1920fn setup(21mut commands: Commands,22asset_server: Res<AssetServer>,23mut meshes: ResMut<Assets<Mesh>>,24mut custom_materials: ResMut<Assets<CustomMaterial>>,25mut standard_materials: ResMut<Assets<StandardMaterial>>,26) {27commands.spawn((28Mesh3d(meshes.add(Plane3d::default().mesh().size(5.0, 5.0))),29MeshMaterial3d(standard_materials.add(Color::srgb(0.3, 0.5, 0.3))),30));31commands.spawn((PointLight::default(), Transform::from_xyz(4.0, 8.0, 4.0)));3233commands.spawn((34Mesh3d(meshes.add(Cuboid::default())),35MeshMaterial3d(custom_materials.add(CustomMaterial {36texture: asset_server.load(37"models/FlightHelmet/FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png",38),39})),40Transform::from_xyz(0.0, 0.5, 0.0),41));4243// camera44commands.spawn((45Camera3d::default(),46Transform::from_xyz(4.0, 2.5, 4.0).looking_at(Vec3::ZERO, Vec3::Y),47MainCamera,48));49}5051fn rotate_camera(mut cam_transform: Single<&mut Transform, With<MainCamera>>, time: Res<Time>) {52cam_transform.rotate_around(53Vec3::ZERO,54Quat::from_axis_angle(Vec3::Y, 45f32.to_radians() * time.delta_secs()),55);56cam_transform.look_at(Vec3::ZERO, Vec3::Y);57}5859#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)]60struct CustomMaterial {61#[texture(0)]62#[sampler(1)]63texture: Handle<Image>,64}6566impl Material for CustomMaterial {67fn fragment_shader() -> ShaderRef {68SHADER_ASSET_PATH.into()69}70}717273