bevy_core_pipeline/fullscreen_vertex_shader/
mod.rs

1use bevy_asset::{load_embedded_asset, Handle};
2use bevy_ecs::{resource::Resource, world::FromWorld};
3use bevy_render::render_resource::VertexState;
4use bevy_shader::Shader;
5
6/// A shader that renders to the whole screen. Useful for post-processing.
7#[derive(Resource, Clone)]
8pub struct FullscreenShader(Handle<Shader>);
9
10impl FromWorld for FullscreenShader {
11    fn from_world(world: &mut bevy_ecs::world::World) -> Self {
12        Self(load_embedded_asset!(world, "fullscreen.wgsl"))
13    }
14}
15
16impl FullscreenShader {
17    /// Gets the raw shader handle.
18    pub fn shader(&self) -> Handle<Shader> {
19        self.0.clone()
20    }
21
22    /// Creates a [`VertexState`] that uses the [`FullscreenShader`] to output a
23    /// ```wgsl
24    /// struct FullscreenVertexOutput {
25    ///     @builtin(position)
26    ///     position: vec4<f32>;
27    ///     @location(0)
28    ///     uv: vec2<f32>;
29    /// };
30    /// ```
31    /// from the vertex shader.
32    /// The draw call should render one triangle: `render_pass.draw(0..3, 0..1);`
33    pub fn to_vertex_state(&self) -> VertexState {
34        VertexState {
35            shader: self.0.clone(),
36            shader_defs: Vec::new(),
37            entry_point: Some("fullscreen_vertex_shader".into()),
38            buffers: Vec::new(),
39        }
40    }
41}