precision highp float; varying vec2 uv; varying vec3 toLightVector[4]; varying vec3 surfaceNormal; varying vec3 toCameraVector; uniform sampler2D texture0; uniform vec3 lightColor[4]; uniform vec3 attenuation[4]; void main() { float reflectivity = 0.0; float shineDamper = 0.0; vec3 unitNormal = normalize(surfaceNormal); vec3 unitVectorToCamera = normalize(toCameraVector); vec3 totalDiffuse = vec3(0.0); vec3 totalSpecular = vec3(0.0); for(int i=0;i<4;i++){ float distance = length(toLightVector[i]); float attFactor = attenuation[i].x + (attenuation[i].y * distance) + (attenuation[i].z * distance * distance); vec3 unitLightVector = normalize(toLightVector[i]); float nDotl = dot(unitNormal,unitLightVector); float brightness = max(nDotl,0.0); vec3 lightDirection = -unitLightVector; vec3 reflectedLightDirection = reflect(lightDirection, unitNormal); float specularFactor = dot(reflectedLightDirection, unitVectorToCamera); specularFactor = max(specularFactor,0.0); float dampedFactor = pow(specularFactor,shineDamper); totalDiffuse = totalDiffuse + (brightness * lightColor[i]) / attFactor; totalSpecular = totalSpecular + (dampedFactor * reflectivity * lightColor[i]) / attFactor; } totalDiffuse = max(totalDiffuse,0.2); vec4 textureColor = texture2D(texture0, uv); if(textureColor.a<0.5){ discard; } gl_FragColor = vec4(totalDiffuse,1.0) * textureColor + vec4(totalSpecular,1.0); }