Ok, so here you go. It's basically a modified default shader from jPCT-AE which skips the first light source (i.e. it starts with 1, not 0), because the 0 light source is used for another purpose in my dungeon rendering. The shader uses two texture stages. One for the environment mapping and one for the base texture. Anyway...
Vertex shader:
uniform mat4 modelViewMatrix;
uniform mat4 modelViewProjectionMatrix;
uniform vec4 additionalColor;
uniform vec4 ambientColor;
uniform int lightCount;
uniform vec3 lightPositions[8];
uniform vec3 diffuseColors[8];
uniform float fader;
uniform float fogDistance;
uniform float alpha;
attribute vec4 position;
attribute vec3 normal;
attribute vec4 tangent;
attribute vec2 texture0;
attribute vec2 texture1;
varying vec2 texCoord;
varying vec2 texCoord1;
varying vec4 vertexColor;
varying float fogWeight;
void main(void)
{
vec4 vNormi = normalize(modelViewMatrix * vec4(normal, 0.0));
texCoord = vNormi.xz;
texCoord1=texture0;
vec3 vVertex = vec3(modelViewMatrix * position);
vertexColor=vec4(0,0,0,alpha);
if (lightCount>1) {
vec3 normalEye = normalize(modelViewMatrix * vec4(normal, 0.0)).xyz;
vec3 tmpVec = lightPositions[1] - vVertex;
float angle = dot(normalEye, normalize(tmpVec));
if (angle > 0.0) {
vertexColor += vec4(diffuseColors[1] * (angle * (1.0- (min(fader, length(tmpVec)+0.1)/fader))), 0);
}
if (lightCount>2) {
tmpVec = lightPositions[2] - vVertex;
angle = dot(normalEye, normalize(tmpVec));
if (angle > 0.0) {
vertexColor += vec4(diffuseColors[2] * (angle * (1.0- (min(fader, length(tmpVec)+0.1)/fader))), 0);
}
if (lightCount>3) {
tmpVec = lightPositions[3] - vVertex;
angle = dot(normalEye, normalize(tmpVec));
if (angle > 0.0) {
vertexColor += vec4(diffuseColors[3] * (angle * (1.0- (min(fader, length(tmpVec)+0.1)/fader))), 0);
}
if (lightCount>4) {
tmpVec = lightPositions[4] - vVertex;
angle = dot(normalEye, normalize(tmpVec));
if (angle > 0.0) {
vertexColor += vec4(diffuseColors[4] * (angle * (1.0- (min(fader, length(tmpVec)+0.1)/fader))), 0);
}
if (lightCount>5) {
tmpVec = lightPositions[5] - vVertex;
angle = dot(normalEye, normalize(tmpVec));
if (angle > 0.0) {
vertexColor += vec4(diffuseColors[5] * (angle * (1.0- (min(fader, length(tmpVec)+0.1)/fader))), 0);
}
if (lightCount>6) {
tmpVec = lightPositions[6] - vVertex;
angle = dot(normalEye, normalize(tmpVec));
if (angle > 0.0) {
vertexColor += vec4(diffuseColors[6] * (angle * (1.0- (min(fader, length(tmpVec)+0.1)/fader))), 0);
}
if (lightCount>7) {
tmpVec = lightPositions[7] - vVertex;
angle = dot(normalEye, normalize(tmpVec));
if (angle > 0.0) {
vertexColor += vec4(diffuseColors[7] * (angle * (1.0- (min(fader, length(tmpVec)+0.1)/fader))), 0);
}
}
}
}
}
}
}
}
fogWeight = 1.0-clamp((-vVertex.z - (fogDistance-280.0)) / (280.0), 0.0, 1.0);
gl_Position = modelViewProjectionMatrix * position;
}
Fragment shader:
precision highp float;
varying vec2 texCoord;
varying vec2 texCoord1;
varying vec4 vertexColor;
varying float fogWeight;
uniform sampler2D textureUnit0;
uniform sampler2D textureUnit1;
void main ()
{
gl_FragColor = vertexColor*((texture2D(textureUnit0, texCoord1)+texture2D(textureUnit1, texCoord) ) * fogWeight);
}