#version 450 #extension GL_EXT_scalar_block_layout : enable #define MAX_WEIGHTS 3 #define MAX_BONES 50 layout(binding = 0) uniform Transform { mat4 viewProj; mat4 model; mat4 bones[MAX_BONES]; } transform; layout(location = 0) in vec3 vNorm; layout(location = 1) in vec3 vPos; layout(location = 2) in uvec3 vBoneIndices; layout(location = 3) in vec3 vWeights; layout(location = 0) out vec3 fNorm; layout(location = 1) out vec4 fWorldPos; void main() { vec4 totalLocalPos = vec4(0.0f); vec4 totalNormal = vec4(0.0f); for (int i = 0; i < MAX_WEIGHTS; ++i) { totalLocalPos += transform.bones[vBoneIndices[i]] * vec4(vPos, 1.0f) * vWeights[i]; totalNormal += transform.bones[vBoneIndices[i]] * vec4(vNorm, 0.0f) * vWeights[i]; } fNorm = (transform.model * totalNormal).xyz; fWorldPos = transform.model * totalLocalPos; gl_Position = transform.viewProj * fWorldPos; }