#ifdef TONEMAP_IN_SHADER #import bevy_core_pipeline::tonemapping #endif #import bevy_render::{ maths::affine3_to_square, view::View, } @group(0) @binding(0) var view: View; struct VertexInput { @builtin(vertex_index) index: u32, // NOTE: Instance-rate vertex buffer members prefixed with i_ // NOTE: i_model_transpose_colN are the 3 columns of a 3x4 matrix that is the transpose of the // affine 4x3 model matrix. @location(0) i_model_transpose_col0: vec4, @location(1) i_model_transpose_col1: vec4, @location(2) i_model_transpose_col2: vec4, @location(3) i_color: vec4, @location(4) i_uv_offset_scale: vec4, } struct VertexOutput { @builtin(position) clip_position: vec4, @location(0) uv: vec2, @location(1) @interpolate(flat) color: vec4, }; @vertex fn vertex(in: VertexInput) -> VertexOutput { var out: VertexOutput; let vertex_position = vec3( f32(in.index & 0x1u), f32((in.index & 0x2u) >> 1u), 0.0 ); out.clip_position = view.view_proj * affine3_to_square(mat3x4( in.i_model_transpose_col0, in.i_model_transpose_col1, in.i_model_transpose_col2, )) * vec4(vertex_position, 1.0); out.uv = vec2(vertex_position.xy) * in.i_uv_offset_scale.zw + in.i_uv_offset_scale.xy; out.color = in.i_color; return out; } @group(1) @binding(0) var sprite_texture: texture_2d; @group(1) @binding(1) var sprite_sampler: sampler; @fragment fn fragment(in: VertexOutput) -> @location(0) vec4 { var color = in.color * textureSample(sprite_texture, sprite_sampler, in.uv); #ifdef TONEMAP_IN_SHADER color = tonemapping::tone_mapping(color, view.color_grading); #endif return color; }