diff options
Diffstat (limited to 'assets/shaders/skinned_geometry.vert')
-rw-r--r-- | assets/shaders/skinned_geometry.vert | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/assets/shaders/skinned_geometry.vert b/assets/shaders/skinned_geometry.vert index 2021691..a610442 100644 --- a/assets/shaders/skinned_geometry.vert +++ b/assets/shaders/skinned_geometry.vert @@ -4,15 +4,24 @@ layout(location = 0) in vec3 inPosition; layout(location = 1) in vec3 inNormal; layout(location = 2) in vec2 inTexCoords; +layout(location = 3) in ivec4 inBoneIndices; +layout(location = 4) in vec4 inWeights; + +const int MAX_BONES = 100; +const int MAX_BONE_INFLUENCES = 4; + +uniform AnimData { + mat4 boneMatrices[MAX_BONES]; +} anim; uniform Camera { - mat4 view; - mat4 proj; - vec4 viewPos; + mat4 view; + mat4 proj; + vec4 viewPos; } cam; uniform Model { - mat4 inner; + mat4 inner; } model; // Outputs @@ -21,13 +30,23 @@ layout(location = 1) out vec3 fragNormal; layout(location = 2) out vec2 fragTexCoords; out vec4 viewPos; +// out vec4 dbgcolor; void main() { - fragWorldPos = vec3(model.inner * vec4(inPosition, 1.0)); - fragNormal = mat3(transpose(inverse(model.inner))) * inNormal; // world-space normal - fragTexCoords = inTexCoords; + mat4 skinMatrix = + inWeights.x * anim.boneMatrices[int(inBoneIndices.x)] + + inWeights.y * anim.boneMatrices[int(inBoneIndices.y)] + + inWeights.z * anim.boneMatrices[int(inBoneIndices.z)] + + inWeights.w * anim.boneMatrices[int(inBoneIndices.w)]; + + vec4 totalPosition = skinMatrix * vec4(inPosition, 1.0); + + fragWorldPos = vec3(model.inner * totalPosition); + fragNormal = mat3(transpose(inverse(model.inner))) * inNormal; // world-space normal + fragTexCoords = inTexCoords; - viewPos = cam.viewPos; + viewPos = cam.viewPos; - gl_Position = cam.proj * cam.view * model.inner * vec4(inPosition, 1.0); + gl_Position = cam.proj * cam.view * model.inner * vec4(inPosition, 1.0); + // gl_Position = cam.proj * cam.view * model.inner * totalPosition; } |