# 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>
		
	
			
		
			
				
	
	
		
			35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TOML
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			TOML
		
	
	
	
	
	
[package]
 | 
						|
name = "bevy_pbr"
 | 
						|
version = "0.12.0-dev"
 | 
						|
edition = "2021"
 | 
						|
description = "Adds PBR rendering to Bevy Engine"
 | 
						|
homepage = "https://bevyengine.org"
 | 
						|
repository = "https://github.com/bevyengine/bevy"
 | 
						|
license = "MIT OR Apache-2.0"
 | 
						|
keywords = ["bevy"]
 | 
						|
 | 
						|
[features]
 | 
						|
webgl = []
 | 
						|
 | 
						|
[dependencies]
 | 
						|
# bevy
 | 
						|
bevy_app = { path = "../bevy_app", version = "0.12.0-dev" }
 | 
						|
bevy_asset = { path = "../bevy_asset", version = "0.12.0-dev" }
 | 
						|
bevy_core_pipeline = { path = "../bevy_core_pipeline", version = "0.12.0-dev" }
 | 
						|
bevy_ecs = { path = "../bevy_ecs", version = "0.12.0-dev" }
 | 
						|
bevy_math = { path = "../bevy_math", version = "0.12.0-dev" }
 | 
						|
bevy_reflect = { path = "../bevy_reflect", version = "0.12.0-dev", features = ["bevy"] }
 | 
						|
bevy_render = { path = "../bevy_render", version = "0.12.0-dev" }
 | 
						|
bevy_transform = { path = "../bevy_transform", version = "0.12.0-dev" }
 | 
						|
bevy_utils = { path = "../bevy_utils", version = "0.12.0-dev" }
 | 
						|
bevy_window = { path = "../bevy_window", version = "0.12.0-dev" }
 | 
						|
bevy_derive = { path = "../bevy_derive", version = "0.12.0-dev" }
 | 
						|
 | 
						|
# other
 | 
						|
bitflags = "2.3"
 | 
						|
# direct dependency required for derive macro
 | 
						|
bytemuck = { version = "1", features = ["derive"] }
 | 
						|
naga_oil = "0.8"
 | 
						|
radsort = "0.1"
 | 
						|
smallvec = "1.6"
 |