Saving my place w/ shader example
parent
31041be37c
commit
7c6edf31cc
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…
Reference in New Issue