- #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);
- }