bevy/assets/shaders
Robert Swain e6405bb7b4
Use GpuArrayBuffer for MeshUniform (#9254)
# Objective

- Reduce the number of rebindings to enable batching of draw commands

## Solution

- Use the new `GpuArrayBuffer` for `MeshUniform` data to store all
`MeshUniform` data in arrays within fewer bindings
- Sort opaque/alpha mask prepass, opaque/alpha mask main, and shadow
phases also by the batch per-object data binding dynamic offset to
improve performance on WebGL2.

---

## Changelog

- Changed: Per-object `MeshUniform` data is now managed by
`GpuArrayBuffer` as arrays in buffers that need to be indexed into.

## Migration Guide

Accessing the `model` member of an individual mesh object's shader
`Mesh` struct the old way where each `MeshUniform` was stored at its own
dynamic offset:
```rust
struct Vertex {
    @location(0) position: vec3<f32>,
};

fn vertex(vertex: Vertex) -> VertexOutput {
    var out: VertexOutput;
    out.clip_position = mesh_position_local_to_clip(
        mesh.model,
        vec4<f32>(vertex.position, 1.0)
    );
    return out;
}
```

The new way where one needs to index into the array of `Mesh`es for the
batch:
```rust
struct Vertex {
    @builtin(instance_index) instance_index: u32,
    @location(0) position: vec3<f32>,
};

fn vertex(vertex: Vertex) -> VertexOutput {
    var out: VertexOutput;
    out.clip_position = mesh_position_local_to_clip(
        mesh[vertex.instance_index].model,
        vec4<f32>(vertex.position, 1.0)
    );
    return out;
}
```
Note that using the instance_index is the default way to pass the
per-object index into the shader, but if you wish to do custom rendering
approaches you can pass it in however you like.

---------

Co-authored-by: robtfm <50659922+robtfm@users.noreply.github.com>
Co-authored-by: Elabajaba <Elabajaba@users.noreply.github.com>
2023-07-30 13:17:08 +00:00
..
animate_shader.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
array_texture.wgsl fix prepass normal_mapping (#8978) 2023-06-29 00:28:34 +00:00
cubemap_unlit.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
custom_gltf_2d.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
custom_material.frag improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
custom_material.vert Update shader_material_glsl example to include texture sampling (#5215) 2022-07-08 01:14:22 +00:00
custom_material.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
custom_material_screenspace_texture.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
custom_vertex_attribute.wgsl Use GpuArrayBuffer for MeshUniform (#9254) 2023-07-30 13:17:08 +00:00
fallback_image_test.wgsl Fix fallback_image example (#8968) 2023-06-27 18:08:02 +00:00
game_of_life.wgsl Remove unused code in game of life shader (#5349) 2022-07-17 15:24:24 +00:00
instancing.wgsl Use GpuArrayBuffer for MeshUniform (#9254) 2023-07-30 13:17:08 +00:00
line_material.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
post_processing.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
shader_defs.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
show_prepass.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
texture_binding_array.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00
tonemapping_test_patterns.wgsl improve shader import model (#5703) 2023-06-27 00:29:22 +00:00