// 像素着色器
precision mediump float;
const int maxLightCount = 32;
varying vec2 v_texcoord;
varying vec4 v_nomal;
varying vec4 v_position;
varying vec4 v_eye;
varying vec4 v_fragmentColor;
uniform mat4 tMvpMatrix;
uniform vec4 fogColor;
uniform float fogConcentration;
uniform sampler2D Texture;
uniform float fTextureDraw;
uniform float fAddRender;
uniform bool bEnabled[maxLightCount];
uniform vec4 vLightPos[maxLightCount];
uniform vec4 vLightClolor[maxLightCount];
uniform vec4 vLightAttenuation[maxLightCount];
uniform vec4 vSpotDirPos[maxLightCount];uniform float fSpotAngle[maxLightCount];void main()
{
vec4 vColour = vec4(0.0);
for(int i=0; i<maxLightCount; i++){
if(bEnabled[i] == false){
continue;
}
vec4 lightPos = tMvpMatrix * vLightPos[i];
vec4 vObjPos = tMvpMatrix * v_position; vec4 lightDir = normalize(lightPos-vObjPos);
vec4 halfVector=normalize(lightDir+v_eye);
float att = 1.0;
// 计算衰减系数
if(vLightAttenuation[i].w > 0.0){
float d = length(vLightPos[i]-v_position);
att = 1.0/(vLightAttenuation[i].x + vLightAttenuation[i].y*d + vLightAttenuation[i].z*d*d);
// 如果角度小于180度的话,就判断为聚光灯
if(fSpotAngle[i] < 180.0){
float spotAtt = 0.0;
vec4 SpotLigthDir = normalize(v_position - vLightPos[i]);
vec4 vDir = normalize(vSpotDirPos[i] - vLightPos[i]);
float dotSpot = dot(SpotLigthDir, vDir);
float cosCutoff = cos(fSpotAngle[i]*3.1415926/180.0);
if (dotSpot > cosCutoff){
spotAtt = 1.0;
}
att *= spotAtt;
}
}
float nDotVP = max(0.0, dot(v_nomal, lightDir));
float nDotHV = max(0.0, dot(v_nomal, halfVector));
float pf = 0.0;
if(nDotVP > 0.0){
pf = pow(nDotHV, 10.0);
}
float fValue = (nDotVP+0.3+pf)*att;
vec4 vColorIn = vec4(fValue*vLightClolor[i].x, fValue*vLightClolor[i].y, fValue*vLightClolor[i].z, 1.0);
vColour += vColorIn;
}
vColour += v_fragmentColor;
gl_FragColor = texture2D(Texture, v_texcoord)*vColour;
float fogFactor = 0.008 * gl_FragCoord.z/gl_FragCoord.w;
fogFactor *= fogFactor;
fogFactor = clamp(pow(fogConcentration, -fogFactor), 0.0, 1.0);
gl_FragColor = mix(fogColor, gl_FragColor, fogFactor);
}