37 lines
952 B
GLSL
37 lines
952 B
GLSL
#version 450
|
|
|
|
layout(location = 0) in vec3 position;
|
|
layout(location = 1) in vec3 normal;
|
|
layout(location = 2) in uvec4 bone_indices;
|
|
layout(location = 3) in vec4 weights;
|
|
|
|
layout(location = 0) out vec3 frag_normal;
|
|
layout(location = 1) out vec4 light_pos;
|
|
|
|
layout(push_constant) uniform push_t {
|
|
mat4 vp;
|
|
mat4 light_vp;
|
|
} push;
|
|
|
|
layout(binding = 0) uniform transform_t {
|
|
mat4 model;
|
|
} transform;
|
|
|
|
layout(binding = 1) uniform skeleton_t {
|
|
mat4 matrices[32];
|
|
} bones;
|
|
|
|
void main() {
|
|
const mat4 skinning_matrix
|
|
= weights.x * bones.matrices[bone_indices.x]
|
|
+ weights.y * bones.matrices[bone_indices.y]
|
|
+ weights.z * bones.matrices[bone_indices.z]
|
|
+ weights.w * bones.matrices[bone_indices.w];
|
|
const vec4 world_pos
|
|
= transform.model * skinning_matrix * vec4(position, 1.0);
|
|
gl_Position = push.vp * world_pos;
|
|
frag_normal = transpose(
|
|
inverse(mat3(transform.model * skinning_matrix))) * normal;
|
|
light_pos = push.light_vp * world_pos;
|
|
}
|