#version 100 // Input vertex attributes attribute vec3 vertexPosition; attribute vec2 vertexTexCoord; attribute vec3 vertexNormal; attribute vec4 vertexColor; attribute mat4 instanceTransform; // Input uniform values uniform mat4 mvp; uniform mat4 matNormal; // Output vertex attributes (to fragment shader) varying vec3 fragPosition; varying vec2 fragTexCoord; varying vec4 fragColor; varying vec3 fragNormal; // NOTE: Add here your custom variables void main() { // Compute MVP for current instance mat4 mvpi = mvp*instanceTransform; // Send vertex attributes to fragment shader fragPosition = vec3(mvpi*vec4(vertexPosition, 1.0)); fragTexCoord = vertexTexCoord; fragColor = vertexColor; fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0))); // Calculate final vertex position gl_Position = mvpi*vec4(vertexPosition, 1.0); }