layout (location = 0) in vec3 Position; layout (location = 1) in ivec4 BoneIDs; uniform mat4 gWVP; uniform mat4 gBones[50]; mat4 GetBones(int boneid) { // reason it is using loop since this shader is shared code with // opengl es 2.0 and it does not allow variable indexing, and workaround // is to index it inside loop. for(int i = 0; i < 50;i++){ if( i == boneid){ return gBones[i]; } } } void main() { mat4 BoneTransform = GetBones(BoneIDs[0]); BoneTransform += GetBones(BoneIDs[1]); BoneTransform += GetBones(BoneIDs[2]); BoneTransform += GetBones(BoneIDs[3]); vec4 PosL = BoneTransform * vec4(Position, 1.0); gl_Position = gWVP * PosL; } //---