WIP Lights
This commit is contained in:
@@ -2,74 +2,92 @@
|
||||
|
||||
uniform mat4 model;
|
||||
uniform mat4 view;
|
||||
|
||||
|
||||
layout(binding=0) uniform sampler2D texture;
|
||||
|
||||
uniform vec3 lightPosition;
|
||||
uniform float constantAttenuation;
|
||||
uniform float linearAttenuation;
|
||||
uniform float quadraticAttenuation;
|
||||
const int numberOfLights = 2;
|
||||
|
||||
in VertexData {
|
||||
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;
|
||||
|
||||
vec3 scene_ambient = vec3(0.2, 0.2, 0.2);
|
||||
|
||||
out vec4 fragmentColor;
|
||||
|
||||
void main() {
|
||||
|
||||
// Texture
|
||||
vec4 texel = texture2D(texture, Input.TextureCoord);
|
||||
//vec4 texel1 = texture2D(texture1, Input.TextureCoord * 32.0);
|
||||
//vec4 texel2 = texture2D(texture2, Input.TextureCoord * 100.0);
|
||||
//vec4 blend = texture2D(blendmap, Input.TextureCoord);
|
||||
|
||||
//vec4 texel = (blend.x * texel0) + (blend.y * texel1) + (blend.z * texel2);
|
||||
|
||||
//
|
||||
// Phong shading
|
||||
//
|
||||
|
||||
// Light
|
||||
//vec3 lightPosition = vec3(0, 0, 2);
|
||||
vec3 Ls = vec3(1.0, 1.0, 0.9); // Specular light
|
||||
vec3 Ld = vec3(1.0, 1.0, 0.9); // Diffuse light
|
||||
vec3 La = vec3(0.6, 0.6, 0.6); // Ambient light
|
||||
|
||||
// Object
|
||||
// Ambient light
|
||||
vec3 La = scene_ambient; // Ambient light
|
||||
vec3 Ks = vec3(0.3, 0.3, 0.3); // Specular reflectance
|
||||
vec3 Kd = vec3(1.0, 1.0, 1.0); // Diffuse reflectance
|
||||
vec3 Ka = vec3(1.0, 1.0, 1.0); // Ambient reflectance
|
||||
|
||||
vec3 lightPosView = vec3(view * vec4(lightPosition, 1.0));
|
||||
vec3 totalLighting = La * Ka;
|
||||
|
||||
float attenuation;
|
||||
|
||||
for(int i = 0; i < numberOfLights; i++)
|
||||
{
|
||||
// Light
|
||||
//vec3 lightPosition = vec3(0, 0, 2);
|
||||
vec3 Ls = specular[i]; // Specular light
|
||||
vec3 Ld = diffuse[i]; // Diffuse light
|
||||
|
||||
|
||||
// Object
|
||||
|
||||
vec3 lightPosView = vec3(view * vec4(LightPos[i], 1.0));
|
||||
vec3 surfacePosition = vec3(model * vec4(Input.Position, 1.0));
|
||||
vec3 surfacePosView = vec3(view * vec4(surfacePosition, 1.0));
|
||||
vec3 surfaceToLight = normalize(lightPosView - surfacePosView);
|
||||
mat3 normalMatrix = transpose(inverse(mat3(view * model)));
|
||||
vec3 surfaceNormal = normalize(normalMatrix * Input.Normal);
|
||||
|
||||
float dist = length(LightPos[i] - surfacePosition);
|
||||
|
||||
attenuation = 1.0 / (constantAttenuation
|
||||
+ linearAttenuation * dist
|
||||
+ quadraticAttenuation * pow(dist, 2.0));
|
||||
|
||||
attenuation = attenuation * pow(clampedCosine, spotExponent[i]);
|
||||
|
||||
// Diffuse light
|
||||
float dotProd = dot(surfaceToLight, surfaceNormal);
|
||||
dotProd = max(dotProd, 0.0);
|
||||
|
||||
Id = Ld * Kd * abs(dotProd) * attenuation;
|
||||
|
||||
// Specular light
|
||||
vec3 reflection = reflect(-surfaceToLight, surfaceNormal);
|
||||
float dotSpecular = dot(reflection, normalize(-surfacePosView));
|
||||
dotSpecular = max(dotSpecular, 0.0);
|
||||
float specularFactor = pow(dotSpecular, 30.0); // Specular factor
|
||||
vec3 Is = Ls * Ks * specularFactor;
|
||||
|
||||
Is = attenuation * Ls * Ks * specularFactor;
|
||||
|
||||
// Diffuse light
|
||||
float dotProd = dot(surfaceToLight, surfaceNormal);
|
||||
dotProd = max(dotProd, 0.0);
|
||||
vec3 Id = Ld * Kd * abs(dotProd);
|
||||
|
||||
// Ambient light
|
||||
vec3 Ia = La * Ka;
|
||||
|
||||
float dist = length(lightPosition - surfacePosition);
|
||||
float attenuation = 1.0 / (constantAttenuation
|
||||
+ linearAttenuation * dist
|
||||
+ quadraticAttenuation * pow(dist, 2.0));
|
||||
|
||||
fragmentColor = vec4((Is + Id) * attenuation + Ia, 1.0) * texel;
|
||||
totalLighting = totalLighting + Id + Is;
|
||||
}
|
||||
fragmentColor = vec4(totalLighting, 1.0) * texel;
|
||||
|
||||
|
||||
//fragmentColor = vec4(Id, 1.0) * texel;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user