71 lines
2.2 KiB
GLSL
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;
|
|
} |