Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1//! Example of a fragment shader for an ExtendedMaterial<StandardMaterial, E> setup to
2//! correctly handle order independent transparency.
3//! See examples/3d/order_independent_transpatency.rs
5// In our case we're always transparent and so forward rendered, but
6// this is the general setup if it's not always the case.
7@if(PREPASS_PIPELINE)
8import bevy_pbr::{
9 prepass::io::{VertexOutput, FragmentOutput},
10};
11@else // PREPASS_PIPELINE
12import bevy_pbr::render::{
13 forward_io::{VertexOutput, FragmentOutput},
14};
16@if(MATERIAL_OIT_ENABLED)
17import bevy_core_pipeline::oit::draw::oit_draw;
18@if(MATERIAL_OIT_ENABLED)
19import bevy_pbr::render::pbr_types;
20@if(MATERIAL_OIT_ENABLED)
21import bevy_pbr::render::pbr_fragment::pbr_input_from_standard_material;
23/// The material parameters
24struct Colors {
25 color1: vec4<f32>,
26 color2: vec4<f32>,
27};
29@group(constants::MATERIAL_BIND_GROUP) @binding(100) var<uniform> material: Colors;
31@fragment
32fn fragment(
33 in: VertexOutput,
34) -> FragmentOutput {
35 var out: FragmentOutput;
37 // This produces a checkered pattern along the uv isolines filled with the two colors
38 let grid = vec2u(in.uv * 30.0f) % 2;
39 out.color = select(material.color1, material.color2, (grid.x + grid.y == 1));
41@if(MATERIAL_OIT_ENABLED) {
42 let pbr_input = pbr_input_from_standard_material(in, false);
43 let alpha_mode = pbr_input.material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS;
44 if alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_BLEND {
45 // The fragments will only be drawn during the oit resolve pass.
46 oit_draw(in.position, vec4(out.color.rgb * out.color.a, out.color.a));
47 discard;
48 }
49 // Both `Premultiplied` and `Add` colors are premultiplied in `premultiply_alpha()`
50 if alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_PREMULTIPLIED
51 || alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_ADD {
52 // The fragments will only be drawn during the oit resolve pass.
53 oit_draw(in.position, out.color);
54 discard;
55 }
58 return out;
Contents