#version 100 #define MAX_BONE_NUM 64 // Input vertex attributes attribute vec3 vertexPosition; attribute vec2 vertexTexCoord; attribute vec4 vertexColor; attribute vec4 vertexBoneIds; attribute vec4 vertexBoneWeights; // Input uniform values uniform mat4 mvp; uniform mat4 boneMatrices[MAX_BONE_NUM]; // Output vertex attributes (to fragment shader) varying vec2 fragTexCoord; varying vec4 fragColor; void main() { int boneIndex0 = int(vertexBoneIds.x); int boneIndex1 = int(vertexBoneIds.y); int boneIndex2 = int(vertexBoneIds.z); int boneIndex3 = int(vertexBoneIds.w); vec4 skinnedPosition = vertexBoneWeights.x*(boneMatrices[boneIndex0]*vec4(vertexPosition, 1.0f)) + vertexBoneWeights.y*(boneMatrices[boneIndex1]*vec4(vertexPosition, 1.0f)) + vertexBoneWeights.z*(boneMatrices[boneIndex2]*vec4(vertexPosition, 1.0f)) + vertexBoneWeights.w*(boneMatrices[boneIndex3]*vec4(vertexPosition, 1.0f)); fragTexCoord = vertexTexCoord; fragColor = vertexColor; gl_Position = mvp*skinnedPosition; }