struct FragmentInput { @builtin(position) fragment_coordinate: vec4, @location(0) world_position: vec4, @location(1) world_normal: vec3, @location(2) uv: vec2, }; struct TileLight { color: vec4, intensity: f32, position: vec2, }; struct CanvasMaterial { ambient_color: vec4, tile_lights: array, number_of_lights: u32, }; @group(1) @binding(0) var canvas_material: CanvasMaterial; @fragment fn fragment(input: FragmentInput) -> @location(0) vec4 { var output_color = canvas_material.ambient_color; var lighting = vec4(); for (var i: u32 = 0u; i < canvas_material.number_of_lights; i++) { var luminance = pow(length(canvas_material.tile_lights[i].position - input.world_position.xy), -2.0); luminance *= canvas_material.tile_lights[i].intensity * 2.5; lighting += vec4(luminance * canvas_material.tile_lights[i].color.rgb, 0.0); } output_color += lighting; return output_color; }