#version 330 core layout (location = 0) in vec3 aPosition; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoord; out vec3 FragPos; out vec3 Normal; out vec2 TexCoord; uniform mat4 uModel; uniform mat4 uView; uniform mat4 uProjection; void main() { FragPos = vec3(uModel * vec4(aPosition, 1.0)); // Use mat3(uModel) directly - avoids expensive inverse() per vertex Normal = mat3(uModel) * aNormal; TexCoord = aTexCoord; gl_Position = uProjection * uView * vec4(FragPos, 1.0); }