Files
Tobias Dahl 0ec0022d6a WIP Lights
2014-03-11 09:18:51 +01:00

71 lines
2.2 KiB
GLSL

uniform mat4 model;
uniform mat4 view;
layout(binding=0) uniform sampler2D texture;
const int numberOfLights = 2;
lightSource lights[numberOfLights];
uniform vec4 position[numberOfLights];
uniform vec4 specular[numberOfLights];
uniform vec4 diffuse[numberOfLights];
uniform float constantAttenuation[numberOfLights];
uniform float linearAttenuation[numberOfLights];
uniform float quadraticAttenuation[numberOfLights];
uniform float spotExponent[numberOfLights];
in VertexData {
vec3 Position;
vec3 Normal;
vec2 TextureCoord;
} Input;
vec4 scene_ambient = vec4(0.2, 0.2, 0.2, 1.0);
out vec4 fragmentColor;
void main()
{
vec4 texel = texture2D(texture, Input.TextureCoord);
vec3 normalDirection = normalize(Normal);
vec3 viewDirection = normalize(vec3(v_inv * vec4(0.0, 0.0, 0.0, 1.0) - Position));
vec3 lightDirection;
float attenuation;
// initialize total lighting with ambient lighting
vec3 totalLighting = vec3(scene_ambient) * vec3(frontMaterial.ambient);
for (int index = 0; index < numberOfLights; index++) // for all light sources
{
vec3 positionToLightSource = vec3(position[index] - Position);
float distance = length(positionToLightSource);
lightDirection = normalize(positionToLightSource);
attenuation = 1.0 / (constantAttenuation[index]
+ linearAttenuation[index] * distance
+ quadraticAttenuation[index] * distance * distance);
attenuation = attenuation * pow(clampedCosine, spotExponent[index]);
vec3 diffuseReflection = attenuation
* vec3(diffuse[index]) * vec3(frontMaterial.diffuse)
* max(0.0, dot(normalDirection, lightDirection));
vec3 specularReflection;
if (dot(normalDirection, lightDirection) < 0.0) // light source on the wrong side?
{
specularReflection = vec3(0.0, 0.0, 0.0); // no specular reflection
}
else // light source on the right side
{
specularReflection = attenuation * vec3(specular[index]) * vec3(frontMaterial.specular)
* pow(max(0.0, dot(reflect(-lightDirection, normalDirection), viewDirection)), frontMaterial.shininess);
}
totalLighting = totalLighting + diffuseReflection + specularReflection;
}
fragmentColor = vec4(totalLighting, 1.0) * texel;
}