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::{
2 mesh2d::functions as mesh_functions,
3 mesh2d::vertex_output::VertexOutput,
4 mesh2d::view_bindings::view,
5 mesh2d::vertex_input::{Vertex, decompress_vertex},
6 mesh2d::bindings as mesh2d_bindings,
7 sprite_mesh::bindings::material,
8 sprite_mesh::functions as sprite_functions,
9};
10@if(BINDLESS)
11import package::sprite_mesh::bindings::material_indices;
13@if(TONEMAP_IN_SHADER)
14import bevy_core_pipeline::tonemapping;
15@if(SRGB_OUTPUT)
16import bevy_render::color_operations::linear_to_srgb;
17@if(OKLAB_OUTPUT)
18import bevy_render::color_operations::linear_rgb_to_oklab;
20@vertex
21fn vertex(vertex: Vertex) -> VertexOutput {
22 let instance_index = vertex.instance_index;
24@if(BINDLESS)
25 let slot = mesh2d_bindings::mesh[instance_index].material_bind_group_slot;
26@if(BINDLESS)
27 let vertex_scale = material[material_indices[slot].material].vertex_scale;
28@else
29 let vertex_scale = material.vertex_scale;
30@if(BINDLESS)
31 let vertex_offset = material[material_indices[slot].material].vertex_offset;
32@else
33 let vertex_offset = material.vertex_offset;
35 var out: VertexOutput;
36 let uncompressed_vertex = decompress_vertex(vertex, instance_index);
37@if(VERTEX_UVS)
38 out.uv = uncompressed_vertex.uv;
40@if(VERTEX_POSITIONS)
41 var world_from_local = mesh_functions::get_world_from_local(instance_index);
42@if(VERTEX_POSITIONS)
43 let position = vec4<f32>(uncompressed_vertex.position * vec3<f32>(vertex_scale, 1.0) + vec3<f32>(vertex_offset, 0.0), 1.0);
45@if(VERTEX_POSITIONS)
46 out.world_position = mesh_functions::mesh2d_position_local_to_world(
47 world_from_local,
48 position
49 );
50@if(VERTEX_POSITIONS)
51 out.position = mesh_functions::mesh2d_position_world_to_clip(out.world_position);
53@if(VERTEX_NORMALS)
54 out.world_normal = mesh_functions::mesh2d_normal_local_to_world(uncompressed_vertex.normal, vertex.instance_index);
56@if(VERTEX_TANGENTS)
57 out.world_tangent = mesh_functions::mesh2d_tangent_local_to_world(
58 world_from_local,
59 uncompressed_vertex.tangent
60 );
62@if(VERTEX_COLORS)
63 out.color = uncompressed_vertex.color;
65 out.instance_index = instance_index;
67 return out;
70@fragment
71fn fragment(
72 mesh: VertexOutput,
73) -> @location(0) vec4<f32> {
74 var output_color = sprite_functions::sample_final_color(mesh.uv, mesh.instance_index);
76@if(TONEMAP_IN_SHADER)
77 output_color = tonemapping::tone_mapping(output_color, view.color_grading);
79@if(SRGB_OUTPUT)
80 output_color = vec4(linear_to_srgb(output_color.rgb), output_color.a);
82@if(OKLAB_OUTPUT)
83 output_color = vec4(linear_rgb_to_oklab(output_color.rgb), output_color.a);
85 return output_color;
Contents