Skip to content

Commit cc4062e

Browse files
committed
Split mesh shader files (#4867)
# Objective - Split PBR and 2D mesh shaders into types and bindings to prepare the shaders to be more reusable. - See #3969 for details. I'm doing this in multiple steps to make review easier. --- ## Changelog - Changed: 2D and PBR mesh shaders are now split into types and bindings, the following shader imports are available: `bevy_pbr::mesh_view_types`, `bevy_pbr::mesh_view_bindings`, `bevy_pbr::mesh_types`, `bevy_pbr::mesh_bindings`, `bevy_sprite::mesh2d_view_types`, `bevy_sprite::mesh2d_view_bindings`, `bevy_sprite::mesh2d_types`, `bevy_sprite::mesh2d_bindings` ## Migration Guide - In shaders for 3D meshes: - `#import bevy_pbr::mesh_view_bind_group` -> `#import bevy_pbr::mesh_view_bindings` - `#import bevy_pbr::mesh_struct` -> `#import bevy_pbr::mesh_types` - NOTE: If you are using the mesh bind group at bind group index 2, you can remove those binding statements in your shader and just use `#import bevy_pbr::mesh_bindings` which itself imports the mesh types needed for the bindings. - In shaders for 2D meshes: - `#import bevy_sprite::mesh2d_view_bind_group` -> `#import bevy_sprite::mesh2d_view_bindings` - `#import bevy_sprite::mesh2d_struct` -> `#import bevy_sprite::mesh2d_types` - NOTE: If you are using the mesh2d bind group at bind group index 2, you can remove those binding statements in your shader and just use `#import bevy_sprite::mesh2d_bindings` which itself imports the mesh2d types needed for the bindings.
1 parent bdef86e commit cc4062e

26 files changed

+207
-162
lines changed

assets/shaders/animate_shader.wgsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#import bevy_pbr::mesh_view_bind_group
2-
#import bevy_pbr::mesh_struct
1+
#import bevy_pbr::mesh_types
2+
#import bevy_pbr::mesh_view_bindings
33

44
[[group(1), binding(0)]]
55
var<uniform> mesh: Mesh;

assets/shaders/custom_material_screenspace_texture.wgsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#import bevy_pbr::mesh_view_bind_group
1+
#import bevy_pbr::mesh_view_bindings
22

33
[[group(1), binding(0)]]
44
var texture: texture_2d<f32>;

assets/shaders/custom_vertex_attribute.wgsl

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#import bevy_pbr::mesh_view_bind_group
2-
#import bevy_pbr::mesh_struct
1+
#import bevy_pbr::mesh_view_bindings
2+
#import bevy_pbr::mesh_bindings
33

44
struct Vertex {
55
[[location(0)]] position: vec3<f32>;
@@ -12,9 +12,6 @@ struct CustomMaterial {
1212
[[group(1), binding(0)]]
1313
var<uniform> material: CustomMaterial;
1414

15-
[[group(2), binding(0)]]
16-
var<uniform> mesh: Mesh;
17-
1815
struct VertexOutput {
1916
[[builtin(position)]] clip_position: vec4<f32>;
2017
[[location(0)]] blend_color: vec4<f32>;

assets/shaders/instancing.wgsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#import bevy_pbr::mesh_view_bind_group
2-
#import bevy_pbr::mesh_struct
1+
#import bevy_pbr::mesh_types
2+
#import bevy_pbr::mesh_view_bindings
33

44
[[group(1), binding(0)]]
55
var<uniform> mesh: Mesh;

assets/shaders/shader_defs.wgsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#import bevy_pbr::mesh_view_bind_group
2-
#import bevy_pbr::mesh_struct
1+
#import bevy_pbr::mesh_types
2+
#import bevy_pbr::mesh_view_bindings
33

44
[[group(1), binding(0)]]
55
var<uniform> mesh: Mesh;
@@ -26,7 +26,7 @@ fn vertex(vertex: Vertex) -> VertexOutput {
2626
[[stage(fragment)]]
2727
fn fragment() -> [[location(0)]] vec4<f32> {
2828
var color = vec4<f32>(0.0, 0.0, 1.0, 1.0);
29-
# ifdef IS_RED
29+
# ifdef IS_RED
3030
color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
3131
# endif
3232
return color;

crates/bevy_pbr/src/lib.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ use bevy_render::{
4949
};
5050
use bevy_transform::TransformSystem;
5151

52+
pub const PBR_TYPES_SHADER_HANDLE: HandleUntyped =
53+
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 1708015359337029744);
54+
pub const PBR_BINDINGS_SHADER_HANDLE: HandleUntyped =
55+
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 5635987986427308186);
5256
pub const PBR_SHADER_HANDLE: HandleUntyped =
5357
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 4805239651767701046);
5458
pub const SHADOW_SHADER_HANDLE: HandleUntyped =
@@ -60,6 +64,18 @@ pub struct PbrPlugin;
6064

6165
impl Plugin for PbrPlugin {
6266
fn build(&self, app: &mut App) {
67+
load_internal_asset!(
68+
app,
69+
PBR_TYPES_SHADER_HANDLE,
70+
"render/pbr_types.wgsl",
71+
Shader::from_wgsl
72+
);
73+
load_internal_asset!(
74+
app,
75+
PBR_BINDINGS_SHADER_HANDLE,
76+
"render/pbr_bindings.wgsl",
77+
Shader::from_wgsl
78+
);
6379
load_internal_asset!(app, PBR_SHADER_HANDLE, "render/pbr.wgsl", Shader::from_wgsl);
6480
load_internal_asset!(
6581
app,

crates/bevy_pbr/src/pbr_material.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ impl From<Handle<Image>> for StandardMaterial {
118118
}
119119
}
120120

121-
// NOTE: These must match the bit flags in bevy_pbr/src/render/pbr.wgsl!
121+
// NOTE: These must match the bit flags in bevy_pbr/src/render/pbr_types.wgsl!
122122
bitflags::bitflags! {
123123
#[repr(transparent)]
124124
pub struct StandardMaterialFlags: u32 {

crates/bevy_pbr/src/render/depth.wgsl

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
1-
#import bevy_pbr::mesh_struct
1+
#import bevy_pbr::mesh_view_types
2+
#import bevy_pbr::mesh_types
23

3-
// NOTE: Keep in sync with pbr.wgsl
4-
struct View {
5-
view_proj: mat4x4<f32>;
6-
projection: mat4x4<f32>;
7-
world_position: vec3<f32>;
8-
};
94
[[group(0), binding(0)]]
105
var<uniform> view: View;
116

crates/bevy_pbr/src/render/mesh.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,41 @@ const MAX_JOINTS: usize = 256;
3535
const JOINT_SIZE: usize = std::mem::size_of::<Mat4>();
3636
pub(crate) const JOINT_BUFFER_SIZE: usize = MAX_JOINTS * JOINT_SIZE;
3737

38-
pub const MESH_VIEW_BIND_GROUP_HANDLE: HandleUntyped =
38+
pub const MESH_VIEW_TYPES_HANDLE: HandleUntyped =
39+
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 8140454348013264787);
40+
pub const MESH_VIEW_BINDINGS_HANDLE: HandleUntyped =
3941
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 9076678235888822571);
40-
pub const MESH_STRUCT_HANDLE: HandleUntyped =
42+
pub const MESH_TYPES_HANDLE: HandleUntyped =
4143
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 2506024101911992377);
44+
pub const MESH_BINDINGS_HANDLE: HandleUntyped =
45+
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 16831548636314682308);
4246
pub const MESH_SHADER_HANDLE: HandleUntyped =
4347
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 3252377289100772450);
4448
pub const SKINNING_HANDLE: HandleUntyped =
4549
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 13215291596265391738);
4650

4751
impl Plugin for MeshRenderPlugin {
4852
fn build(&self, app: &mut bevy_app::App) {
49-
load_internal_asset!(app, MESH_SHADER_HANDLE, "mesh.wgsl", Shader::from_wgsl);
5053
load_internal_asset!(
5154
app,
52-
MESH_STRUCT_HANDLE,
53-
"mesh_struct.wgsl",
55+
MESH_VIEW_TYPES_HANDLE,
56+
"mesh_view_types.wgsl",
57+
Shader::from_wgsl
58+
);
59+
load_internal_asset!(
60+
app,
61+
MESH_VIEW_BINDINGS_HANDLE,
62+
"mesh_view_bindings.wgsl",
5463
Shader::from_wgsl
5564
);
65+
load_internal_asset!(app, MESH_TYPES_HANDLE, "mesh_types.wgsl", Shader::from_wgsl);
5666
load_internal_asset!(
5767
app,
58-
MESH_VIEW_BIND_GROUP_HANDLE,
59-
"mesh_view_bind_group.wgsl",
68+
MESH_BINDINGS_HANDLE,
69+
"mesh_bindings.wgsl",
6070
Shader::from_wgsl
6171
);
72+
load_internal_asset!(app, MESH_SHADER_HANDLE, "mesh.wgsl", Shader::from_wgsl);
6273
load_internal_asset!(app, SKINNING_HANDLE, "skinning.wgsl", Shader::from_wgsl);
6374

6475
app.add_plugin(UniformComponentPlugin::<MeshUniform>::default());

crates/bevy_pbr/src/render/mesh.wgsl

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#import bevy_pbr::mesh_view_bind_group
2-
#import bevy_pbr::mesh_struct
1+
#import bevy_pbr::mesh_view_bindings
2+
#import bevy_pbr::mesh_bindings
33

44
struct Vertex {
55
[[location(0)]] position: vec3<f32>;
@@ -30,14 +30,6 @@ struct VertexOutput {
3030
#endif
3131
};
3232

33-
[[group(2), binding(0)]]
34-
var<uniform> mesh: Mesh;
35-
#ifdef SKINNED
36-
[[group(2), binding(1)]]
37-
var<uniform> joint_matrices: SkinnedMesh;
38-
#import bevy_pbr::skinning
39-
#endif
40-
4133
[[stage(vertex)]]
4234
fn vertex(vertex: Vertex) -> VertexOutput {
4335
var out: VertexOutput;
@@ -68,7 +60,7 @@ fn vertex(vertex: Vertex) -> VertexOutput {
6860
#endif
6961
#ifdef VERTEX_COLORS
7062
out.color = vertex.color;
71-
#endif
63+
#endif
7264

7365
out.uv = vertex.uv;
7466
out.clip_position = view.view_proj * out.world_position;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#define_import_path bevy_pbr::mesh_bindings
2+
3+
#import bevy_pbr::mesh_types
4+
5+
[[group(2), binding(0)]]
6+
var<uniform> mesh: Mesh;
7+
#ifdef SKINNED
8+
[[group(2), binding(1)]]
9+
var<uniform> joint_matrices: SkinnedMesh;
10+
#import bevy_pbr::skinning
11+
#endif

crates/bevy_pbr/src/render/mesh_struct.wgsl renamed to crates/bevy_pbr/src/render/mesh_types.wgsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#define_import_path bevy_pbr::mesh_struct
1+
#define_import_path bevy_pbr::mesh_types
22

33
struct Mesh {
44
model: mat4x4<f32>;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#define_import_path bevy_pbr::mesh_view_bindings
2+
3+
#import bevy_pbr::mesh_view_types
4+
5+
[[group(0), binding(0)]]
6+
var<uniform> view: View;
7+
[[group(0), binding(1)]]
8+
var<uniform> lights: Lights;
9+
#ifdef NO_ARRAY_TEXTURES_SUPPORT
10+
[[group(0), binding(2)]]
11+
var point_shadow_textures: texture_depth_cube;
12+
#else
13+
[[group(0), binding(2)]]
14+
var point_shadow_textures: texture_depth_cube_array;
15+
#endif
16+
[[group(0), binding(3)]]
17+
var point_shadow_textures_sampler: sampler_comparison;
18+
#ifdef NO_ARRAY_TEXTURES_SUPPORT
19+
[[group(0), binding(4)]]
20+
var directional_shadow_textures: texture_depth_2d;
21+
#else
22+
[[group(0), binding(4)]]
23+
var directional_shadow_textures: texture_depth_2d_array;
24+
#endif
25+
[[group(0), binding(5)]]
26+
var directional_shadow_textures_sampler: sampler_comparison;
27+
28+
#ifdef NO_STORAGE_BUFFERS_SUPPORT
29+
[[group(0), binding(6)]]
30+
var<uniform> point_lights: PointLights;
31+
[[group(0), binding(7)]]
32+
var<uniform> cluster_light_index_lists: ClusterLightIndexLists;
33+
[[group(0), binding(8)]]
34+
var<uniform> cluster_offsets_and_counts: ClusterOffsetsAndCounts;
35+
#else
36+
[[group(0), binding(6)]]
37+
var<storage> point_lights: PointLights;
38+
[[group(0), binding(7)]]
39+
var<storage> cluster_light_index_lists: ClusterLightIndexLists;
40+
[[group(0), binding(8)]]
41+
var<storage> cluster_offsets_and_counts: ClusterOffsetsAndCounts;
42+
#endif

crates/bevy_pbr/src/render/mesh_view_bind_group.wgsl renamed to crates/bevy_pbr/src/render/mesh_view_types.wgsl

Lines changed: 1 addition & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#define_import_path bevy_pbr::mesh_view_bind_group
1+
#define_import_path bevy_pbr::mesh_view_types
22

33
struct View {
44
view_proj: mat4x4<f32>;
@@ -79,42 +79,3 @@ struct ClusterOffsetsAndCounts {
7979
data: array<vec2<u32>>;
8080
};
8181
#endif
82-
83-
[[group(0), binding(0)]]
84-
var<uniform> view: View;
85-
[[group(0), binding(1)]]
86-
var<uniform> lights: Lights;
87-
#ifdef NO_ARRAY_TEXTURES_SUPPORT
88-
[[group(0), binding(2)]]
89-
var point_shadow_textures: texture_depth_cube;
90-
#else
91-
[[group(0), binding(2)]]
92-
var point_shadow_textures: texture_depth_cube_array;
93-
#endif
94-
[[group(0), binding(3)]]
95-
var point_shadow_textures_sampler: sampler_comparison;
96-
#ifdef NO_ARRAY_TEXTURES_SUPPORT
97-
[[group(0), binding(4)]]
98-
var directional_shadow_textures: texture_depth_2d;
99-
#else
100-
[[group(0), binding(4)]]
101-
var directional_shadow_textures: texture_depth_2d_array;
102-
#endif
103-
[[group(0), binding(5)]]
104-
var directional_shadow_textures_sampler: sampler_comparison;
105-
106-
#ifdef NO_STORAGE_BUFFERS_SUPPORT
107-
[[group(0), binding(6)]]
108-
var<uniform> point_lights: PointLights;
109-
[[group(0), binding(7)]]
110-
var<uniform> cluster_light_index_lists: ClusterLightIndexLists;
111-
[[group(0), binding(8)]]
112-
var<uniform> cluster_offsets_and_counts: ClusterOffsetsAndCounts;
113-
#else
114-
[[group(0), binding(6)]]
115-
var<storage> point_lights: PointLights;
116-
[[group(0), binding(7)]]
117-
var<storage> cluster_light_index_lists: ClusterLightIndexLists;
118-
[[group(0), binding(8)]]
119-
var<storage> cluster_offsets_and_counts: ClusterOffsetsAndCounts;
120-
#endif

crates/bevy_pbr/src/render/pbr.wgsl

Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -32,57 +32,9 @@
3232
//
3333
// The above integration needs to be approximated.
3434

35-
#import bevy_pbr::mesh_view_bind_group
36-
#import bevy_pbr::mesh_struct
37-
38-
[[group(2), binding(0)]]
39-
var<uniform> mesh: Mesh;
40-
41-
struct StandardMaterial {
42-
base_color: vec4<f32>;
43-
emissive: vec4<f32>;
44-
perceptual_roughness: f32;
45-
metallic: f32;
46-
reflectance: f32;
47-
// 'flags' is a bit field indicating various options. u32 is 32 bits so we have up to 32 options.
48-
flags: u32;
49-
alpha_cutoff: f32;
50-
};
51-
52-
let STANDARD_MATERIAL_FLAGS_BASE_COLOR_TEXTURE_BIT: u32 = 1u;
53-
let STANDARD_MATERIAL_FLAGS_EMISSIVE_TEXTURE_BIT: u32 = 2u;
54-
let STANDARD_MATERIAL_FLAGS_METALLIC_ROUGHNESS_TEXTURE_BIT: u32 = 4u;
55-
let STANDARD_MATERIAL_FLAGS_OCCLUSION_TEXTURE_BIT: u32 = 8u;
56-
let STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT: u32 = 16u;
57-
let STANDARD_MATERIAL_FLAGS_UNLIT_BIT: u32 = 32u;
58-
let STANDARD_MATERIAL_FLAGS_ALPHA_MODE_OPAQUE: u32 = 64u;
59-
let STANDARD_MATERIAL_FLAGS_ALPHA_MODE_MASK: u32 = 128u;
60-
let STANDARD_MATERIAL_FLAGS_ALPHA_MODE_BLEND: u32 = 256u;
61-
let STANDARD_MATERIAL_FLAGS_TWO_COMPONENT_NORMAL_MAP: u32 = 512u;
62-
let STANDARD_MATERIAL_FLAGS_FLIP_NORMAL_MAP_Y: u32 = 1024u;
63-
64-
[[group(1), binding(0)]]
65-
var<uniform> material: StandardMaterial;
66-
[[group(1), binding(1)]]
67-
var base_color_texture: texture_2d<f32>;
68-
[[group(1), binding(2)]]
69-
var base_color_sampler: sampler;
70-
[[group(1), binding(3)]]
71-
var emissive_texture: texture_2d<f32>;
72-
[[group(1), binding(4)]]
73-
var emissive_sampler: sampler;
74-
[[group(1), binding(5)]]
75-
var metallic_roughness_texture: texture_2d<f32>;
76-
[[group(1), binding(6)]]
77-
var metallic_roughness_sampler: sampler;
78-
[[group(1), binding(7)]]
79-
var occlusion_texture: texture_2d<f32>;
80-
[[group(1), binding(8)]]
81-
var occlusion_sampler: sampler;
82-
[[group(1), binding(9)]]
83-
var normal_map_texture: texture_2d<f32>;
84-
[[group(1), binding(10)]]
85-
var normal_map_sampler: sampler;
35+
#import bevy_pbr::mesh_view_bindings
36+
#import bevy_pbr::pbr_bindings
37+
#import bevy_pbr::mesh_bindings
8638

8739
let PI: f32 = 3.141592653589793;
8840

@@ -467,7 +419,7 @@ struct FragmentInput {
467419
#endif
468420
#ifdef VERTEX_COLORS
469421
[[location(4)]] color: vec4<f32>;
470-
#endif
422+
#endif
471423
};
472424

473425
[[stage(fragment)]]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#define_import_path bevy_pbr::pbr_bindings
2+
3+
#import bevy_pbr::pbr_types
4+
5+
[[group(1), binding(0)]]
6+
var<uniform> material: StandardMaterial;
7+
[[group(1), binding(1)]]
8+
var base_color_texture: texture_2d<f32>;
9+
[[group(1), binding(2)]]
10+
var base_color_sampler: sampler;
11+
[[group(1), binding(3)]]
12+
var emissive_texture: texture_2d<f32>;
13+
[[group(1), binding(4)]]
14+
var emissive_sampler: sampler;
15+
[[group(1), binding(5)]]
16+
var metallic_roughness_texture: texture_2d<f32>;
17+
[[group(1), binding(6)]]
18+
var metallic_roughness_sampler: sampler;
19+
[[group(1), binding(7)]]
20+
var occlusion_texture: texture_2d<f32>;
21+
[[group(1), binding(8)]]
22+
var occlusion_sampler: sampler;
23+
[[group(1), binding(9)]]
24+
var normal_map_texture: texture_2d<f32>;
25+
[[group(1), binding(10)]]
26+
var normal_map_sampler: sampler;

0 commit comments

Comments
 (0)