feat: full-screen quad + BlackHoleMaterial pipeline

This commit is contained in:
xfy 2026-07-10 10:20:38 +08:00
parent 9c8f384d0e
commit a45d42c07a
5 changed files with 67 additions and 5 deletions

View 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);
}

View File

@ -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
View 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
View File

@ -0,0 +1,4 @@
pub mod plugin;
pub mod material;
pub use plugin::BlackHolePlugin;

33
src/render/plugin.rs Normal file
View 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();
}
}