blob: 0a61a00eae6431c6ada6b976abca53d5e06b4d90 [file] [log] [blame]
attribute vec3 position;
attribute vec2 texcoord;
attribute vec3 normal;
attribute vec3 tangent;
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 NormalMatrix;
varying vec2 TextureCoord;
varying mat4 TangentToEyeMatrix;
void main(void)
{
TextureCoord = texcoord;
// Calculate bitangent
vec3 bitangent = normalize(cross(normal, tangent));
// Calculate tangent space to eye space transformation matrix.
// We need this matrix in the fragment shader to transform the data
// from the normal map, which is in tangent space, to eye space,
// so that we can perform meaningful lighting calculations. Alternatively,
// we could have used an EyeToTangentMatrix, to convert light direction etc
// to tangent space.
// First calculate a tangent space to object space transformation matrix.
mat4 TangentToObject = mat4(tangent.x, tangent.y, tangent.z, 0.0,
bitangent.x, bitangent.y, bitangent.z, 0.0,
normal.x, normal.y, normal.z, 0.0,
0.0, 0.0, 0.0, 1.0);
// Multiply with the NormalMatrix to further transform from object
// space to eye space (we are manipulating normals, so we can't use
// the ModelView matrix for this step!).
TangentToEyeMatrix = NormalMatrix * TangentToObject;
// Transform the position to clip coordinates
gl_Position = ModelViewProjectionMatrix * vec4(position, 1.0);
}