feat: full-screen quad + BlackHoleMaterial pipeline
This commit is contained in:
parent
9c8f384d0e
commit
a45d42c07a
11
assets/shaders/black_hole.wgsl
Normal file
11
assets/shaders/black_hole.wgsl
Normal file
@ -0,0 +1,11 @@
|
||||
#import bevy_sprite::mesh2d_vertex_output::VertexOutput
|
||||
|
||||
@group(#{MATERIAL_BIND_GROUP}) @binding(0) var<uniform> time: f32;
|
||||
|
||||
@fragment
|
||||
fn fragment(in: VertexOutput) -> @location(0) vec4<f32> {
|
||||
// Gradient from time, just to prove the uniform flows.
|
||||
let t = (sin(time) + 1.0) * 0.5;
|
||||
let col = mix(vec3<f32>(0.02, 0.02, 0.05), vec3<f32>(0.08, 0.04, 0.12), t);
|
||||
return vec4<f32>(col, 1.0);
|
||||
}
|
||||
@ -3,6 +3,7 @@ use bevy::window::WindowPlugin;
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod web;
|
||||
mod render;
|
||||
|
||||
fn main() {
|
||||
// On web, abort startup if WebGPU isn't available and show a message.
|
||||
@ -24,10 +25,6 @@ fn main() {
|
||||
}),
|
||||
..default()
|
||||
}))
|
||||
.add_systems(Startup, setup)
|
||||
.add_plugins(render::BlackHolePlugin)
|
||||
.run();
|
||||
}
|
||||
|
||||
fn setup(mut commands: Commands) {
|
||||
commands.spawn(Camera2d);
|
||||
}
|
||||
|
||||
17
src/render/material.rs
Normal file
17
src/render/material.rs
Normal file
@ -0,0 +1,17 @@
|
||||
use bevy::prelude::*;
|
||||
use bevy::reflect::TypePath;
|
||||
use bevy::render::render_resource::AsBindGroup;
|
||||
use bevy::shader::ShaderRef;
|
||||
use bevy::sprite_render::Material2d;
|
||||
|
||||
#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)]
|
||||
pub struct BlackHoleMaterial {
|
||||
#[uniform(0)]
|
||||
pub time: f32,
|
||||
}
|
||||
|
||||
impl Material2d for BlackHoleMaterial {
|
||||
fn fragment_shader() -> ShaderRef {
|
||||
"shaders/black_hole.wgsl".into()
|
||||
}
|
||||
}
|
||||
4
src/render/mod.rs
Normal file
4
src/render/mod.rs
Normal file
@ -0,0 +1,4 @@
|
||||
pub mod plugin;
|
||||
pub mod material;
|
||||
|
||||
pub use plugin::BlackHolePlugin;
|
||||
33
src/render/plugin.rs
Normal file
33
src/render/plugin.rs
Normal file
@ -0,0 +1,33 @@
|
||||
use bevy::prelude::*;
|
||||
use bevy::sprite_render::Material2dPlugin;
|
||||
|
||||
use super::material::BlackHoleMaterial;
|
||||
|
||||
pub struct BlackHolePlugin;
|
||||
|
||||
impl Plugin for BlackHolePlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_plugins(Material2dPlugin::<BlackHoleMaterial>::default())
|
||||
.add_systems(Startup, spawn_fullscreen_quad)
|
||||
.add_systems(Update, update_time);
|
||||
}
|
||||
}
|
||||
|
||||
fn spawn_fullscreen_quad(
|
||||
mut commands: Commands,
|
||||
mut meshes: ResMut<Assets<Mesh>>,
|
||||
mut materials: ResMut<Assets<BlackHoleMaterial>>,
|
||||
) {
|
||||
commands.spawn(Camera2d);
|
||||
commands.spawn((
|
||||
Mesh2d(meshes.add(Rectangle::new(2.0, 2.0))),
|
||||
MeshMaterial2d(materials.add(BlackHoleMaterial { time: 0.0 })),
|
||||
Transform::default(),
|
||||
));
|
||||
}
|
||||
|
||||
fn update_time(time: Res<Time>, mut materials: ResMut<Assets<BlackHoleMaterial>>) {
|
||||
for (_, mat) in materials.iter_mut() {
|
||||
mat.time = time.elapsed_secs();
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user