layout(location = 0) in vec3 inPosition; layout(location = 1) in vec3 inNormal; layout(location = 2) in vec2 inUV; layout(location = 3) in vec3 inTangent; layout(location = 4) in mat4 inModel; layout(location = 0) out vec3 outFragPos; layout(location = 1) out vec3 outNormal; layout(location = 2) out vec2 outUV; layout(location = 3) out mat3 TBN; layout(std140, binding = 0) uniform UniformObjectData { mat4 projection, view, model; vec4 albedoTint; vec4 emission; float metallic, roughness; } objectData; out gl_PerVertex { vec4 gl_Position; }; void main() { gl_Position = objectData.projection * objectData.view * inModel * vec4(inPosition, 1.0); outFragPos = vec3(inModel * vec4(inPosition, 1.0)); outNormal = transpose(inverse(mat3(inModel))) * inNormal; outUV = inUV; vec3 Bitangent = cross(inTangent, normalize(outNormal)); vec3 T = normalize(vec3(inModel * vec4(inTangent, 0.0))); vec3 B = normalize(vec3(inModel * vec4(Bitangent, 0.0))); vec3 N = normalize(vec3(inModel * vec4(inNormal, 0.0))); TBN = mat3(T, B, N); }