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")]
|
#[cfg(target_arch = "wasm32")]
|
||||||
mod web;
|
mod web;
|
||||||
|
mod render;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// On web, abort startup if WebGPU isn't available and show a message.
|
// On web, abort startup if WebGPU isn't available and show a message.
|
||||||
@ -24,10 +25,6 @@ fn main() {
|
|||||||
}),
|
}),
|
||||||
..default()
|
..default()
|
||||||
}))
|
}))
|
||||||
.add_systems(Startup, setup)
|
.add_plugins(render::BlackHolePlugin)
|
||||||
.run();
|
.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