Saving my place w/ shader example

main
Elijah C. Voigt 2 years ago
parent 31041be37c
commit 7c6edf31cc

BIN
assets/examples/images/texture.png (Stored with Git LFS)

Binary file not shown.

@ -0,0 +1,57 @@
#import bevy_pbr::{
pbr_fragment::pbr_input_from_standard_material,
forward_io::{VertexOutput, FragmentOutput},
mesh_view_bindings::globals,
pbr_functions::{
alpha_discard,
apply_pbr_lighting,
main_pass_post_lighting_processing
},
}
struct MatExt {
step: u32,
}
@group(1) @binding(100)
var<uniform> mat_ext: MatExt;
fn random(st: vec2<f32>) -> f32 {
var a = vec2(12.9898, 78.233);
var b = 43758.5453123;
return fract(sin(dot(st.xy, a)) * b);
}
fn noise(st: vec2<f32>) -> f32 {
var i = floor(st);
var f = floor(st);
var a = random(i);
var b = random(i + vec2(1.0, 0.0));
var c = random(i + vec2(0.0, 1.0));
var d = random(i + vec2(1.0, 1.0));
var u = smoothstep(vec2(0.0), vec2(1.0), f);
return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
}
@fragment
fn fragment(
in: VertexOutput,
@builtin(front_facing) is_front: bool,
) -> FragmentOutput {
var pbr_input = pbr_input_from_standard_material(in, is_front);
pbr_input.material.base_color.b = pbr_input.material.base_color.r;
var out: FragmentOutput;
out.color = apply_pbr_lighting(pbr_input);
var pos = vec2(in.uv * 5.0) + vec2(globals.time);
var n = noise(pos);
out.color = vec4(vec3(n), abs(sin(globals.time)));
return out;
}

@ -0,0 +1,85 @@
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<StandardMaterial, MatExt>;
fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(ImagePlugin::default_nearest()),
MaterialPlugin::<MyMat>::default(),
))
.add_systems(Startup, setup)
.add_systems(Update, rotate)
.run();
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<MyMat>>,
) {
commands.spawn(MaterialMeshBundle {
mesh: meshes.add(
Mesh::try_from(shape::UVSphere {
radius: 1.0,
..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::Forward,
alpha_mode: AlphaMode::Mask(0.5),
..default()
},
extension: MatExt { step: 3 },
}),
..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)]
step: u32,
}
impl MaterialExtension for MatExt {
fn fragment_shader() -> ShaderRef {
"examples/shaders/dissolve.wgsl".into()
}
fn deferred_fragment_shader() -> ShaderRef {
"examples/shaders/dissolve.wgsl".into()
}
}
fn rotate(
mut query: Query<&mut Transform, With<Handle<Mesh>>>,
time: Res<Time>,
) {
query.iter_mut().for_each(|mut t| {
t.rotate_local_y(time.delta_seconds() / 2.0);
t.rotate_local_z(time.delta_seconds() / 2.0);
t.rotate_local_x(time.delta_seconds() / 2.0);
})
}
Loading…
Cancel
Save