#version 330 // Input vertex attributes in vec3 vertexPosition; in vec2 vertexTexCoord; in vec3 vertexNormal; in vec4 vertexColor; // Input uniform values uniform mat4 mvp; uniform mat4 matModel; // Output vertex attributes (to fragment shader) out vec3 fragPosition; out vec2 fragTexCoord; out vec4 fragColor; out vec3 fragNormal; void main() { // Calculate fragment position in world space fragPosition = vec3(matModel * vec4(vertexPosition, 1.0)); fragTexCoord = vertexTexCoord; fragColor = vertexColor; fragNormal = normalize(vec3(matModel * vec4(vertexNormal, 0.0))); // 1. Get the base color of the object // Calculate final vertex position gl_Position = mvp * vec4(vertexPosition, 1.0); }