forward.vert 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /* forward.vert -- Vertex shader used for forward shading
  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. #include "../include/light.glsl"
  12. /* === Attributes === */
  13. layout(location = 0) in vec3 aPosition;
  14. layout(location = 1) in vec2 aTexCoord;
  15. layout(location = 2) in vec3 aNormal;
  16. layout(location = 3) in vec4 aColor;
  17. layout(location = 4) in vec4 aTangent;
  18. layout(location = 5) in ivec4 aBoneIDs;
  19. layout(location = 6) in vec4 aWeights;
  20. layout(location = 10) in mat4 iMatModel;
  21. layout(location = 14) in vec4 iColor;
  22. /* === Uniforms === */
  23. uniform sampler1D uTexBoneMatrices;
  24. uniform mat4 uMatLightVP[LIGHT_FORWARD_COUNT];
  25. uniform mat4 uMatInvView; ///< Only for billboard modes
  26. uniform mat4 uMatNormal;
  27. uniform mat4 uMatModel;
  28. uniform mat4 uMatVP;
  29. uniform vec4 uAlbedoColor;
  30. uniform vec2 uTexCoordOffset;
  31. uniform vec2 uTexCoordScale;
  32. uniform bool uInstancing;
  33. uniform bool uSkinning;
  34. uniform int uBillboard;
  35. /* === Varyings === */
  36. out vec3 vPosition;
  37. out vec2 vTexCoord;
  38. out vec4 vColor;
  39. out mat3 vTBN;
  40. out vec4 vPosLightSpace[LIGHT_FORWARD_COUNT];
  41. /* === Helper Functions === */
  42. mat4 BoneMatrix(int boneID)
  43. {
  44. int baseIndex = 4 * boneID;
  45. vec4 row0 = texelFetch(uTexBoneMatrices, baseIndex + 0, 0);
  46. vec4 row1 = texelFetch(uTexBoneMatrices, baseIndex + 1, 0);
  47. vec4 row2 = texelFetch(uTexBoneMatrices, baseIndex + 2, 0);
  48. vec4 row3 = texelFetch(uTexBoneMatrices, baseIndex + 3, 0);
  49. return transpose(mat4(row0, row1, row2, row3));
  50. }
  51. mat4 SkinMatrix(ivec4 boneIDs, vec4 weights)
  52. {
  53. return weights.x * BoneMatrix(boneIDs.x) +
  54. weights.y * BoneMatrix(boneIDs.y) +
  55. weights.z * BoneMatrix(boneIDs.z) +
  56. weights.w * BoneMatrix(boneIDs.w);
  57. }
  58. /* === Main program === */
  59. void main()
  60. {
  61. mat4 matModel = uMatModel;
  62. mat3 matNormal = mat3(uMatNormal);
  63. if (uSkinning) {
  64. mat4 sMatModel = SkinMatrix(aBoneIDs, aWeights);
  65. matModel = matModel * sMatModel;
  66. matNormal = matNormal * mat3(transpose(inverse(sMatModel)));
  67. }
  68. if (uInstancing) {
  69. matModel = transpose(iMatModel) * matModel;
  70. matNormal = mat3(transpose(inverse(iMatModel))) * matNormal;
  71. }
  72. switch(uBillboard) {
  73. case BILLBOARD_NONE:
  74. break;
  75. case BILLBOARD_FRONT:
  76. BillboardFront(matModel, matNormal, uMatInvView);
  77. break;
  78. case BILLBOARD_Y_AXIS:
  79. BillboardYAxis(matModel, matNormal, uMatInvView);
  80. break;
  81. }
  82. vec3 T = normalize(matNormal * aTangent.xyz);
  83. vec3 N = normalize(matNormal * aNormal);
  84. vec3 B = normalize(cross(N, T) * aTangent.w);
  85. vPosition = vec3(matModel * vec4(aPosition, 1.0));
  86. vTexCoord = uTexCoordOffset + aTexCoord * uTexCoordScale;
  87. vColor = aColor * iColor * uAlbedoColor;
  88. vTBN = mat3(T, B, N);
  89. for (int i = 0; i < LIGHT_FORWARD_COUNT; i++) {
  90. vPosLightSpace[i] = uMatLightVP[i] * vec4(vPosition, 1.0);
  91. }
  92. gl_Position = uMatVP * vec4(vPosition, 1.0);
  93. }