WIP Lights
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user