#version 120
uniform sampler2D Texture;
uniform sampler2D NormalMap;
uniform float TexNormalScale;
varying vec3 Normal;
varying vec3 PixPos;
vec3 Mul(vec2 Vec, mat2x3 M)
{
return vec3(Vec[0][0] * Vec.x + Vec[1][0] * Vec.y,
Vec[0][1] * Vec.x + Vec[1][1] * Vec.y,
Vec[0][2] * Vec.x + Vec[1][2] * Vec.y);
}
mat3 ComputeTBN(vec3 Normal, vec3 Position, vec2 TexCoords)
{
vec3 EdgeFaceA = dFdx(Position);
vec3 EdgeFaceB = dFdy(Position);
vec2 UvEdgeA = dFdx(TexCoords);
vec2 UvEdgeB = dFdy(TexCoords);
mat2x3 M = mat2x3(EdgeFaceA, EdgeFaceB);
vec3 Tangent = Mul(vec2(UvEdgeA.x, UvEdgeB.x), M);
vec3 Bitangent = Mul(vec2(UvEdgeA.y, UvEdgeB.y), M);
float MaxL = max(length(Tangent), length(Bitangent));
return mat3(Tangent / MaxL, Bitangent / MaxL, Normal);
}
void main()
{
vec3 Shaded = vec3(gl_FrontMaterial.emission);
vec3 EyeVector = normalize(-PixPos);
vec3 Normal = normalize(Normal);
mat3 TBN = ComputeTBN(Normal, PixPos, gl_TexCoord[0].st);
Normal = TBN * vec3(texture2D(NormalMap, gl_TexCoord[0].st) - 0.5f);
int i;
for(i = 0; i < 2; i++)
{
vec3 LightDirection = normalize(vec3(gl_LightSource[i].position) - PixPos);
vec3 ReflectVector = normalize(reflect(-LightDirection, Normal));
//Ambient
Shaded += vec3(gl_LightSource[i].ambient) * vec3(gl_FrontMaterial.ambient);
//Diffuse
Shaded += vec3(gl_LightSource[i].diffuse) * vec3(gl_FrontMaterial.diffuse) * max(dot(Normal, LightDirection), 0.0);
//Specular
Shaded += vec3(gl_LightSource[i].specular) * vec3(gl_FrontMaterial.specular) * pow(max(dot(ReflectVector, EyeVector), 0.0), gl_FrontMaterial.shininess);
}
gl_FragColor = vec4(Shaded, 1.0) * gl_Color * texture2D(Texture, gl_TexCoord[0].st);
}