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#import bevy_sprite::{
2 mesh2d_vertex_output::VertexOutput,
3 mesh2d_view_bindings::view,
4}
6#ifdef TONEMAP_IN_SHADER
7#import bevy_core_pipeline::tonemapping
8#endif
10struct ColorMaterial {
11 color: vec4<f32>,
12 // 'flags' is a bit field indicating various options. u32 is 32 bits so we have up to 32 options.
13 flags: u32,
14 alpha_cutoff: f32,
15};
17const COLOR_MATERIAL_FLAGS_TEXTURE_BIT: u32 = 1u;
18const COLOR_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS: u32 = 3221225472u; // (0b11u32 << 30)
19const COLOR_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE: u32 = 0u; // (0u32 << 30)
20const COLOR_MATERIAL_FLAGS_ALPHA_MODE_MASK: u32 = 1073741824u; // (1u32 << 30)
21const COLOR_MATERIAL_FLAGS_ALPHA_MODE_BLEND: u32 = 2147483648u; // (2u32 << 30)
23@group(2) @binding(0) var<uniform> material: ColorMaterial;
24@group(2) @binding(1) var texture: texture_2d<f32>;
25@group(2) @binding(2) var texture_sampler: sampler;
27@fragment
28fn fragment(
29 mesh: VertexOutput,
30) -> @location(0) vec4<f32> {
31 var output_color: vec4<f32> = material.color;
33#ifdef VERTEX_COLORS
34 output_color = output_color * mesh.color;
35#endif
37 if ((material.flags & COLOR_MATERIAL_FLAGS_TEXTURE_BIT) != 0u) {
38 output_color = output_color * textureSample(texture, texture_sampler, mesh.uv);
39 }
41 output_color = alpha_discard(material, output_color);
43#ifdef TONEMAP_IN_SHADER
44 output_color = tonemapping::tone_mapping(output_color, view.color_grading);
45#endif
46 return output_color;
49fn alpha_discard(material: ColorMaterial, output_color: vec4<f32>) -> vec4<f32> {
50 var color = output_color;
51 let alpha_mode = material.flags & COLOR_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS;
52 if alpha_mode == COLOR_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE {
53 // NOTE: If rendering as opaque, alpha should be ignored so set to 1.0
54 color.a = 1.0;
55 }
56#ifdef MAY_DISCARD
57 else if alpha_mode == COLOR_MATERIAL_FLAGS_ALPHA_MODE_MASK {
58 if color.a >= material.alpha_cutoff {
59 // NOTE: If rendering as masked alpha and >= the cutoff, render as fully opaque
60 color.a = 1.0;
61 } else {
62 // NOTE: output_color.a < in.material.alpha_cutoff should not be rendered
63 discard;
64 }
65 }
66#endif // MAY_DISCARD
68 return color;
Contents