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.
1import package::mesh2d::{
2 vertex_output::VertexOutput,
3 view_bindings::view,
4 bindings::mesh,
5};
6import bevy_render::bindless::{bindless_samplers_filtering, bindless_textures_2d};
8@if(TONEMAP_IN_SHADER)
9import bevy_core_pipeline::tonemapping;
10@if(SRGB_OUTPUT)
11import bevy_render::color_operations::linear_to_srgb;
12@if(OKLAB_OUTPUT)
13import bevy_render::color_operations::linear_rgb_to_oklab;
15struct ColorMaterial {
16 color: vec4<f32>,
17 uv_transform: mat3x3<f32>,
18 /// 'flags' is a bit field indicating various options. u32 is 32 bits so we have up to 32 options.
19 flags: u32,
20 alpha_cutoff: f32,
21};
23@if(BINDLESS) {
24/// The index table for bindless operation.
25struct ColorMaterialBindings {
26 material: u32, // 0
27 color_texture: u32, // 1
28 color_sampler: u32, // 2
31@group(constants::MATERIAL_BIND_GROUP) @binding(0) var<storage> color_material_indices:
32 array<ColorMaterialBindings>;
33@group(constants::MATERIAL_BIND_GROUP) @binding(10) var<storage> color_materials: array<ColorMaterial>;
35@else {
36@group(constants::MATERIAL_BIND_GROUP) @binding(0) var<uniform> material: ColorMaterial;
37@group(constants::MATERIAL_BIND_GROUP) @binding(1) var texture: texture_2d<f32>;
38@group(constants::MATERIAL_BIND_GROUP) @binding(2) var texture_sampler: sampler;
41const COLOR_MATERIAL_FLAGS_TEXTURE_BIT: u32 = 1u;
42const COLOR_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS: u32 = 3221225472u; // (0b11u32 << 30)
43const COLOR_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE: u32 = 0u; // (0u32 << 30)
44const COLOR_MATERIAL_FLAGS_ALPHA_MODE_MASK: u32 = 1073741824u; // (1u32 << 30)
45const COLOR_MATERIAL_FLAGS_ALPHA_MODE_BLEND: u32 = 2147483648u; // (2u32 << 30)
47@fragment
48fn fragment(
49 in: VertexOutput,
50) -> @location(0) vec4<f32> {
51 let slot = mesh[in.instance_index].material_bind_group_slot;
53@if(BINDLESS)
54 var output_color: vec4<f32> = color_materials[color_material_indices[slot].material].color;
55@else
56 var output_color: vec4<f32> = material.color;
58@if(VERTEX_COLORS)
59 output_color = output_color * in.color;
61@if(BINDLESS)
62 let uv_transform = color_materials[color_material_indices[slot].material].uv_transform;
63@else
64 let uv_transform = material.uv_transform;
65@if(BINDLESS)
66 let flags = color_materials[color_material_indices[slot].material].flags;
67@else
68 let flags = material.flags;
69@if(BINDLESS)
70 let alpha_cutoff = color_materials[color_material_indices[slot].material].alpha_cutoff;
71@else
72 let alpha_cutoff = material.alpha_cutoff;
74 let uv = (uv_transform * vec3(in.uv, 1.0)).xy;
76 if ((flags & COLOR_MATERIAL_FLAGS_TEXTURE_BIT) != 0u) {
77 @if(BINDLESS)
78 output_color = output_color * textureSample(
79 bindless_textures_2d[color_material_indices[slot].color_texture],
80 bindless_samplers_filtering[color_material_indices[slot].color_sampler],
81 uv
82 );
83 @else
84 output_color = output_color * textureSample(texture, texture_sampler, uv);
85 }
87 output_color = alpha_discard(flags, alpha_cutoff, output_color);
89@if(TONEMAP_IN_SHADER)
90 output_color = tonemapping::tone_mapping(output_color, view.color_grading);
91@if(SRGB_OUTPUT)
92 output_color = vec4(linear_to_srgb(output_color.rgb), output_color.a);
93@if(OKLAB_OUTPUT)
94 output_color = vec4(linear_rgb_to_oklab(output_color.rgb), output_color.a);
95 return output_color;
98fn alpha_discard(flags: u32, alpha_cutoff: f32, output_color: vec4<f32>) -> vec4<f32> {
99 var color = output_color;
100 let alpha_mode = flags & COLOR_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS;
101 if alpha_mode == COLOR_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE {
102 // NOTE: If rendering as opaque, alpha should be ignored so set to 1.0
103 color.a = 1.0;
104 }
105 else {
106 @if(MAY_DISCARD)
107 if alpha_mode == COLOR_MATERIAL_FLAGS_ALPHA_MODE_MASK {
108 if color.a >= alpha_cutoff {
109 // NOTE: If rendering as masked alpha and >= the cutoff, render as fully opaque
110 color.a = 1.0;
111 } else {
112 // NOTE: output_color.a < in.material.alpha_cutoff should not be rendered
113 discard;
114 }
115 }
116 }
118 return color;
Contents