Code:
uniform sampler2D normalTex, posTex, colorTex;
uniform vec3 light1Pos;
uniform vec3 light1Color;
uniform vec3 light2Pos;
uniform vec3 light2Color;
uniform vec3 light3Pos;
uniform vec3 light3Color;
uniform vec3 light4Pos;
uniform vec3 light4Color;
void main()
{
vec4 color = texture2D(colorTex, gl_TexCoord[0].xy);
if (color.a < 0.00001)
{
discard;
}
vec2 norm = texture2D(normalTex, gl_TexCoord[0].xy).xy;
vec3 normal = vec3(norm.xy, 0.0);
normal.z = sqrt(1.0 - norm.x * norm.x - norm.y * norm.y);
vec3 position = texture2D(posTex, gl_TexCoord[0].xy).xyz;
vec3 view = normalize(-position);
vec3 l1 = normalize(light1Pos - position);
float atten1 = max(0.0, dot(l1, normal));
vec3 reflectv1 = normalize(reflect(-l1, normal));
float spec1 = max(dot(reflectv1, view), 0.0);
vec3 l2 = normalize(light2Pos - position);
float atten2 = max(0.0, dot(l2, normal));
vec3 reflectv2 = normalize(reflect(-l2, normal));
float spec2 = max(dot(reflectv2, view), 0.0);
vec3 l3 = normalize(light3Pos - position);
float atten3 = max(0.0, dot(l3, normal));
vec3 reflectv3 = normalize(reflect(-l3, normal));
float spec3 = max(dot(reflectv3, view), 0.0);
vec3 l4 = normalize(light4Pos - position);
float atten4 = max(0.0, dot(l4, normal));
vec3 reflectv4 = normalize(reflect(-l4, normal));
float spec4 = max(dot(reflectv4, view), 0.0);
gl_FragColor = color +
(vec4(min(pow(spec1, 32.0) + atten1 * light1Color, 1.0), 1) +
vec4(min(pow(spec2, 32.0) + atten2 * light2Color, 1.0), 1) +
vec4(min(pow(spec3, 32.0) + atten3 * light3Color, 1.0), 1) +
vec4(min(pow(spec4, 32.0) + atten4 * light4Color, 1.0), 1));
}