Skinned.vert 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // ----------------------------------------------------------------
  2. // From Game Programming in C++ by Sanjay Madhav
  3. // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
  4. //
  5. // Released under the BSD License
  6. // See LICENSE in root directory for full details.
  7. // ----------------------------------------------------------------
  8. // Request GLSL 3.3
  9. #version 330
  10. // Uniforms for world transform and view-proj
  11. uniform mat4 uWorldTransform;
  12. uniform mat4 uViewProj;
  13. // Uniform for matrix palette
  14. uniform mat4 uMatrixPalette[96];
  15. // Attribute 0 is position, 1 is normal,
  16. // 2 is bone indices, 3 is weights,
  17. // 4 is tex coords.
  18. layout(location = 0) in vec3 inPosition;
  19. layout(location = 1) in vec3 inNormal;
  20. layout(location = 2) in uvec4 inSkinBones;
  21. layout(location = 3) in vec4 inSkinWeights;
  22. layout(location = 4) in vec2 inTexCoord;
  23. // Any vertex outputs (other than position)
  24. out vec2 fragTexCoord;
  25. // Normal (in world space)
  26. out vec3 fragNormal;
  27. // Position (in world space)
  28. out vec3 fragWorldPos;
  29. void main()
  30. {
  31. // Convert position to homogeneous coordinates
  32. vec4 pos = vec4(inPosition, 1.0);
  33. // Skin the position
  34. vec4 skinnedPos = (pos * uMatrixPalette[inSkinBones.x]) * inSkinWeights.x;
  35. skinnedPos += (pos * uMatrixPalette[inSkinBones.y]) * inSkinWeights.y;
  36. skinnedPos += (pos * uMatrixPalette[inSkinBones.z]) * inSkinWeights.z;
  37. skinnedPos += (pos * uMatrixPalette[inSkinBones.w]) * inSkinWeights.w;
  38. // Transform position to world space
  39. skinnedPos = skinnedPos * uWorldTransform;
  40. // Save world position
  41. fragWorldPos = skinnedPos.xyz;
  42. // Transform to clip space
  43. gl_Position = skinnedPos * uViewProj;
  44. // Skin the vertex normal
  45. vec4 skinnedNormal = vec4(inNormal, 0.0f);
  46. skinnedNormal = (skinnedNormal * uMatrixPalette[inSkinBones.x]) * inSkinWeights.x
  47. + (skinnedNormal * uMatrixPalette[inSkinBones.y]) * inSkinWeights.y
  48. + (skinnedNormal * uMatrixPalette[inSkinBones.z]) * inSkinWeights.z
  49. + (skinnedNormal * uMatrixPalette[inSkinBones.w]) * inSkinWeights.w;
  50. // Transform normal into world space (w = 0)
  51. fragNormal = (skinnedNormal * uWorldTransform).xyz;
  52. // Pass along the texture coordinate to frag shader
  53. fragTexCoord = inTexCoord;
  54. }