skinnedBasic.vs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #version 300 es
  2. in vec3 vertexPosition;
  3. in vec2 vertexTexCoord;
  4. in vec3 vertexNormal;
  5. in vec4 vertexColor;
  6. in vec4 vertexBoneIds;
  7. in vec4 vertexBoneWeights;
  8. #define MAX_BONE_NUM 128
  9. uniform mat4 boneMatrices[MAX_BONE_NUM];
  10. uniform mat4 mvp;
  11. out vec3 fragPosition;
  12. out vec2 fragTexCoord;
  13. out vec4 fragColor;
  14. out vec3 fragNormal;
  15. void main()
  16. {
  17. int boneIndex0 = int(vertexBoneIds.x);
  18. int boneIndex1 = int(vertexBoneIds.y);
  19. int boneIndex2 = int(vertexBoneIds.z);
  20. int boneIndex3 = int(vertexBoneIds.w);
  21. vec4 skinnedPosition =
  22. vertexBoneWeights.x * (boneMatrices[boneIndex0] * vec4(vertexPosition, 1.0f)) +
  23. vertexBoneWeights.y * (boneMatrices[boneIndex1] * vec4(vertexPosition, 1.0f)) +
  24. vertexBoneWeights.z * (boneMatrices[boneIndex2] * vec4(vertexPosition, 1.0f)) +
  25. vertexBoneWeights.w * (boneMatrices[boneIndex3] * vec4(vertexPosition, 1.0f));
  26. vec3 skinnedNormal = normalize(
  27. vertexBoneWeights.x * (mat3(boneMatrices[boneIndex0]) * vertexNormal) +
  28. vertexBoneWeights.y * (mat3(boneMatrices[boneIndex1]) * vertexNormal) +
  29. vertexBoneWeights.z * (mat3(boneMatrices[boneIndex2]) * vertexNormal) +
  30. vertexBoneWeights.w * (mat3(boneMatrices[boneIndex3]) * vertexNormal));
  31. fragPosition = skinnedPosition.xyz / skinnedPosition.w;
  32. fragTexCoord = vertexTexCoord;
  33. fragColor = vertexColor;
  34. fragNormal = skinnedNormal;
  35. gl_Position = mvp * vec4(fragPosition, 1.0f);
  36. }