layout(location = 0) in vec3 inPosition; layout(location = 1) in vec3 inNormal; layout(location = 2) in vec2 inTexCoords; layout(location = 3) in vec3 inTangent; layout(location = 4) in vec4 inBoneWeights; layout(location = 5) in ivec4 inBoneIDs; layout(std140, binding = 0) uniform UniformSceneData { mat4 projection, view, model; vec4 cameraPosition; } sceneData; out VS_OUT { vec3 FragPos; vec3 Normal; vec2 TexCoords; mat3 TBN; } vs_out; out gl_PerVertex { vec4 gl_Position; }; void main() { gl_Position = sceneData.projection * sceneData.view * sceneData.model * vec4(inPosition, 1.0); vs_out.Normal = transpose(inverse(mat3(sceneData.model))) * inNormal; vs_out.FragPos = vec3(sceneData.model * vec4(inPosition, 1.0)); vs_out.TexCoords = inTexCoords; vec3 Bitangent = cross(inTangent, normalize(vs_out.Normal)); vec3 T = normalize(vec3(sceneData.model * vec4(inTangent, 0.0))); vec3 B = normalize(vec3(sceneData.model * vec4(Bitangent, 0.0))); vec3 N = normalize(vec3(sceneData.model * vec4(inNormal, 0.0))); vs_out.TBN = mat3(T, B, N); }