2023-03-10 16:47:19 +08:00
|
|
|
#version 450
|
|
|
|
#extension GL_KHR_vulkan_glsl : enable
|
|
|
|
|
|
|
|
//#include "ShaderDescriptorDefinitions.glsl"
|
|
|
|
|
|
|
|
|
|
|
|
layout(location = 0) in vec3 aVertexPos;
|
|
|
|
layout(location = 4) in mat4 worldTransform;
|
|
|
|
layout(location = 9) in uvec4 aBoneIndices;
|
|
|
|
layout(location = 10) in vec4 aBoneWeights;
|
|
|
|
layout(location = 11) in uint firstBoneIndex;
|
|
|
|
|
|
|
|
layout(set = 1, binding = 0) uniform CameraData
|
|
|
|
{
|
|
|
|
vec4 position;
|
|
|
|
mat4 vpMat;
|
|
|
|
mat4 viewMat;
|
|
|
|
mat4 projMat;
|
|
|
|
} cameraData;
|
|
|
|
|
|
|
|
layout (std430, set = 2, binding = 1) buffer AnimBoneMatrices
|
|
|
|
{
|
|
|
|
mat4 data[];
|
|
|
|
} BoneMatrices;
|
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
|
|
|
// // Compute bone matrix
|
2023-03-10 19:22:50 +08:00
|
|
|
mat4 boneMatrix = BoneMatrices.data[firstBoneIndex + aBoneIndices[0]] * aBoneWeights[0];
|
|
|
|
boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[1]] * aBoneWeights[1];
|
|
|
|
boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[2]] * aBoneWeights[2];
|
|
|
|
boneMatrix += BoneMatrices.data[firstBoneIndex + aBoneIndices[3]] * aBoneWeights[3];
|
2023-03-10 16:47:19 +08:00
|
|
|
|
|
|
|
// clip space for rendering
|
2023-03-10 19:22:50 +08:00
|
|
|
// gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f);
|
|
|
|
gl_Position = cameraData.vpMat * worldTransform * boneMatrix * vec4 (aVertexPos, 1.0f);
|
2023-03-10 16:47:19 +08:00
|
|
|
}
|