1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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);
}
|