mirror of
https://github.com/bevyengine/bevy
synced 2024-12-21 18:43:07 +00:00
740ae9a37f
# Objective - It's possible to create a mesh without positions or normals, but currently bevy forces these attributes to be present on any mesh. ## Solution - Don't assume these attributes are present and add a shader defs for each attributes - I updated 2d and 3d meshes to use the same logic. --- ## Changelog - Meshes don't require any attributes # Notes I didn't update the pbr.wgsl shader because I'm not sure how to handle it. It doesn't really make sense to use it without positions or normals.
80 lines
1.8 KiB
WebGPU Shading Language
80 lines
1.8 KiB
WebGPU Shading Language
#import bevy_pbr::mesh_view_bindings
|
|
#import bevy_pbr::mesh_bindings
|
|
|
|
// NOTE: Bindings must come before functions that use them!
|
|
#import bevy_pbr::mesh_functions
|
|
|
|
struct Vertex {
|
|
#ifdef VERTEX_POSITIONS
|
|
@location(0) position: vec3<f32>,
|
|
#endif
|
|
#ifdef VERTEX_NORMALS
|
|
@location(1) normal: vec3<f32>,
|
|
#endif
|
|
#ifdef VERTEX_UVS
|
|
@location(2) uv: vec2<f32>,
|
|
#endif
|
|
#ifdef VERTEX_TANGENTS
|
|
@location(3) tangent: vec4<f32>,
|
|
#endif
|
|
#ifdef VERTEX_COLORS
|
|
@location(4) color: vec4<f32>,
|
|
#endif
|
|
#ifdef SKINNED
|
|
@location(5) joint_indices: vec4<u32>,
|
|
@location(6) joint_weights: vec4<f32>,
|
|
#endif
|
|
};
|
|
|
|
struct VertexOutput {
|
|
@builtin(position) clip_position: vec4<f32>,
|
|
#import bevy_pbr::mesh_vertex_output
|
|
};
|
|
|
|
@vertex
|
|
fn vertex(vertex: Vertex) -> VertexOutput {
|
|
var out: VertexOutput;
|
|
|
|
#ifdef VERTEX_NORMALS
|
|
#ifdef SKINNED
|
|
var model = skin_model(vertex.joint_indices, vertex.joint_weights);
|
|
out.world_normal = skin_normals(model, vertex.normal);
|
|
#else
|
|
var model = mesh.model;
|
|
out.world_normal = mesh_normal_local_to_world(vertex.normal);
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef VERTEX_POSITIONS
|
|
out.world_position = mesh_position_local_to_world(model, vec4<f32>(vertex.position, 1.0));
|
|
out.clip_position = mesh_position_world_to_clip(out.world_position);
|
|
#endif
|
|
|
|
#ifdef VERTEX_UVS
|
|
out.uv = vertex.uv;
|
|
#endif
|
|
|
|
#ifdef VERTEX_TANGENTS
|
|
out.world_tangent = mesh_tangent_local_to_world(model, vertex.tangent);
|
|
#endif
|
|
|
|
#ifdef VERTEX_COLORS
|
|
out.color = vertex.color;
|
|
#endif
|
|
|
|
return out;
|
|
}
|
|
|
|
struct FragmentInput {
|
|
@builtin(front_facing) is_front: bool,
|
|
#import bevy_pbr::mesh_vertex_output
|
|
};
|
|
|
|
@fragment
|
|
fn fragment(in: FragmentInput) -> @location(0) vec4<f32> {
|
|
#ifdef VERTEX_COLORS
|
|
return in.color;
|
|
#else
|
|
return vec4<f32>(1.0, 0.0, 1.0, 1.0);
|
|
#endif
|
|
}
|