
# Objective cleanup some pbr shader code. improve shader stage io consistency and make pbr.wgsl (probably many people's first foray into bevy shader code) a little more human-readable. also fix a couple of small issues with deferred rendering. ## Solution mesh_vertex_output: - rename to forward_io (to align with prepass_io) - rename `MeshVertexOutput` to `VertexOutput` (to align with prepass_io) - move `Vertex` from mesh.wgsl into here (to align with prepass_io) prepass_io: - remove `FragmentInput`, use `VertexOutput` directly (to align with forward_io) - rename `VertexOutput::clip_position` to `position` (to align with forward_io) pbr.wgsl: - restructure so we don't need `#ifdefs` on the actual entrypoint, use VertexOutput and FragmentOutput in all cases and use #ifdefs to import the right struct definitions. - rearrange to make the flow clearer - move alpha_discard up from `pbr_functions::pbr` to avoid needing to call it on some branches and not others - add a bunch of comments deferred_lighting: - move ssao into the `!unlit` block to reflect forward behaviour correctly - fix compile error with deferred + premultiply_alpha ## Migration Guide in custom material shaders: - `pbr_functions::pbr` no longer calls to `pbr_functions::alpha_discard`. if you were using the `pbr` function in a custom shader with alpha mask mode you now also need to call alpha_discard manually - rename imports of `bevy_pbr::mesh_vertex_output` to `bevy_pbr::forward_io` - rename instances of `MeshVertexOutput` to `VertexOutput` in custom material prepass shaders: - rename instances of `VertexOutput::clip_position` to `VertexOutput::position`
38 lines
1.1 KiB
WebGPU Shading Language
38 lines
1.1 KiB
WebGPU Shading Language
#import bevy_pbr::mesh_types
|
|
#import bevy_pbr::mesh_view_bindings globals
|
|
#import bevy_pbr::prepass_utils
|
|
#import bevy_pbr::forward_io VertexOutput
|
|
|
|
struct ShowPrepassSettings {
|
|
show_depth: u32,
|
|
show_normals: u32,
|
|
show_motion_vectors: u32,
|
|
padding_1: u32,
|
|
padding_2: u32,
|
|
}
|
|
@group(1) @binding(0) var<uniform> settings: ShowPrepassSettings;
|
|
|
|
@fragment
|
|
fn fragment(
|
|
#ifdef MULTISAMPLED
|
|
@builtin(sample_index) sample_index: u32,
|
|
#endif
|
|
mesh: VertexOutput,
|
|
) -> @location(0) vec4<f32> {
|
|
#ifndef MULTISAMPLED
|
|
let sample_index = 0u;
|
|
#endif
|
|
if settings.show_depth == 1u {
|
|
let depth = bevy_pbr::prepass_utils::prepass_depth(mesh.position, sample_index);
|
|
return vec4(depth, depth, depth, 1.0);
|
|
} else if settings.show_normals == 1u {
|
|
let normal = bevy_pbr::prepass_utils::prepass_normal(mesh.position, sample_index);
|
|
return vec4(normal, 1.0);
|
|
} else if settings.show_motion_vectors == 1u {
|
|
let motion_vector = bevy_pbr::prepass_utils::prepass_motion_vector(mesh.position, sample_index);
|
|
return vec4(motion_vector / globals.delta_time, 0.0, 1.0);
|
|
}
|
|
|
|
return vec4(0.0);
|
|
}
|