40 行
1.2 KiB

  1. #version 330
  2. // Input vertex attributes
  3. in vec3 vertexPosition;
  4. in vec2 vertexTexCoord;
  5. in vec3 vertexNormal;
  6. in vec4 vertexTangent;
  7. // Input uniform values
  8. uniform mat4 mvp;
  9. uniform mat4 matModel;
  10. // Output vertex attributes (to fragment shader)
  11. out vec3 fragPosition;
  12. out vec2 fragTexCoord;
  13. out vec3 fragNormal;
  14. out vec3 fragTangent;
  15. out vec3 fragBinormal;
  16. void main()
  17. {
  18. // Calculate binormal from vertex normal and tangent
  19. vec3 vertexBinormal = cross(vertexNormal, vec3(vertexTangent));
  20. // Calculate fragment normal based on normal transformations
  21. mat3 normalMatrix = transpose(inverse(mat3(matModel)));
  22. // Calculate fragment position based on model transformations
  23. fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
  24. // Send vertex attributes to fragment shader
  25. fragTexCoord = vertexTexCoord;
  26. fragNormal = normalize(normalMatrix*vertexNormal);
  27. fragTangent = normalize(normalMatrix*vec3(vertexTangent));
  28. fragTangent = normalize(fragTangent - dot(fragTangent, fragNormal)*fragNormal);
  29. fragBinormal = normalize(normalMatrix*vertexBinormal);
  30. fragBinormal = cross(fragNormal, fragTangent);
  31. // Calculate final vertex position
  32. gl_Position = mvp*vec4(vertexPosition, 1.0);
  33. }