depth_cube.vert 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /* depth_cube.vert -- Vertex shader used for omni-lights shadow mapping
  2. *
  3. * Copyright (c) 2025 Le Juez Victor
  4. *
  5. * This software is provided 'as-is', without any express or implied warranty.
  6. * For conditions of distribution and use, see accompanying LICENSE file.
  7. */
  8. #version 330 core
  9. /* === Includes === */
  10. #include "../include/billboard.glsl"
  11. /* === Attributes === */
  12. layout(location = 0) in vec3 aPosition;
  13. layout(location = 1) in vec2 aTexCoord;
  14. layout(location = 3) in vec4 aColor;
  15. layout(location = 5) in ivec4 aBoneIDs;
  16. layout(location = 6) in vec4 aWeights;
  17. /* === Instances Attributes === */
  18. layout(location = 10) in mat4 iMatModel;
  19. layout(location = 14) in vec4 iColor;
  20. /* === Uniforms === */
  21. uniform sampler1D uTexBoneMatrices;
  22. uniform mat4 uMatInvView; ///< Only for billboard modes
  23. uniform mat4 uMatModel;
  24. uniform mat4 uMatVP;
  25. uniform vec2 uTexCoordOffset;
  26. uniform vec2 uTexCoordScale;
  27. uniform float uAlpha;
  28. uniform bool uInstancing;
  29. uniform bool uSkinning;
  30. uniform int uBillboard;
  31. /* === Varyings === */
  32. out vec3 vPosition;
  33. out vec2 vTexCoord;
  34. out float vAlpha;
  35. /* === Helper functions === */
  36. mat4 BoneMatrix(int boneID)
  37. {
  38. int baseIndex = 4 * boneID;
  39. vec4 row0 = texelFetch(uTexBoneMatrices, baseIndex + 0, 0);
  40. vec4 row1 = texelFetch(uTexBoneMatrices, baseIndex + 1, 0);
  41. vec4 row2 = texelFetch(uTexBoneMatrices, baseIndex + 2, 0);
  42. vec4 row3 = texelFetch(uTexBoneMatrices, baseIndex + 3, 0);
  43. return transpose(mat4(row0, row1, row2, row3));
  44. }
  45. mat4 SkinMatrix(ivec4 boneIDs, vec4 weights)
  46. {
  47. return weights.x * BoneMatrix(boneIDs.x) +
  48. weights.y * BoneMatrix(boneIDs.y) +
  49. weights.z * BoneMatrix(boneIDs.z) +
  50. weights.w * BoneMatrix(boneIDs.w);
  51. }
  52. /* === Main function === */
  53. void main()
  54. {
  55. mat4 matModel = uMatModel;
  56. if (uSkinning) {
  57. mat4 sMatModel = SkinMatrix(aBoneIDs, aWeights);
  58. matModel = matModel * sMatModel;
  59. }
  60. if (uInstancing) {
  61. matModel = transpose(iMatModel) * matModel;
  62. }
  63. switch(uBillboard) {
  64. case BILLBOARD_NONE:
  65. break;
  66. case BILLBOARD_FRONT:
  67. BillboardFront(matModel, uMatInvView);
  68. break;
  69. case BILLBOARD_Y_AXIS:
  70. BillboardYAxis(matModel, uMatInvView);
  71. break;
  72. }
  73. vPosition = vec3(matModel * vec4(aPosition, 1.0));
  74. vTexCoord = uTexCoordOffset + aTexCoord * uTexCoordScale;
  75. vAlpha = uAlpha * iColor.a * aColor.a;
  76. gl_Position = uMatVP * vec4(vPosition, 1.0);
  77. }