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 uv_transform: mat3x3<f32>,
13 // 'flags' is a bit field indicating various options. u32 is 32 bits so we have up to 32 options.
14 flags: u32,
15 alpha_cutoff: f32,
16};
18const COLOR_MATERIAL_FLAGS_TEXTURE_BIT: u32 = 1u;
19const COLOR_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS: u32 = 3221225472u; // (0b11u32 << 30)
20const COLOR_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE: u32 = 0u; // (0u32 << 30)
21const COLOR_MATERIAL_FLAGS_ALPHA_MODE_MASK: u32 = 1073741824u; // (1u32 << 30)
22const COLOR_MATERIAL_FLAGS_ALPHA_MODE_BLEND: u32 = 2147483648u; // (2u32 << 30)
24@group(2) @binding(0) var<uniform> material: ColorMaterial;
25@group(2) @binding(1) var texture: texture_2d<f32>;
26@group(2) @binding(2) var texture_sampler: sampler;
28@fragment
29fn fragment(
30 mesh: VertexOutput,
31) -> @location(0) vec4<f32> {
32 var output_color: vec4<f32> = material.color;
34#ifdef VERTEX_COLORS
35 output_color = output_color * mesh.color;
36#endif
38 let uv = (material.uv_transform * vec3(mesh.uv, 1.0)).xy;
40 if ((material.flags & COLOR_MATERIAL_FLAGS_TEXTURE_BIT) != 0u) {
41 output_color = output_color * textureSample(texture, texture_sampler, uv);
42 }
44 output_color = alpha_discard(material, output_color);
46#ifdef TONEMAP_IN_SHADER
47 output_color = tonemapping::tone_mapping(output_color, view.color_grading);
48#endif
49 return output_color;
52fn alpha_discard(material: ColorMaterial, output_color: vec4<f32>) -> vec4<f32> {
53 var color = output_color;
54 let alpha_mode = material.flags & COLOR_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS;
55 if alpha_mode == COLOR_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE {
56 // NOTE: If rendering as opaque, alpha should be ignored so set to 1.0
57 color.a = 1.0;
58 }
59#ifdef MAY_DISCARD
60 else if alpha_mode == COLOR_MATERIAL_FLAGS_ALPHA_MODE_MASK {
61 if color.a >= material.alpha_cutoff {
62 // NOTE: If rendering as masked alpha and >= the cutoff, render as fully opaque
63 color.a = 1.0;
64 } else {
65 // NOTE: output_color.a < in.material.alpha_cutoff should not be rendered
66 discard;
67 }
68 }
69#endif // MAY_DISCARD
71 return color;
Contents