69 lines
2.4 KiB
GLSL
69 lines
2.4 KiB
GLSL
#version 400 core
|
|
|
|
in vec2 pass_textureCoordinates;
|
|
in vec3 surfaceNormal;
|
|
in vec3 toLightVector[4];
|
|
in vec3 toCameraVector;
|
|
// FOW: Fog Of War result calculation
|
|
in float visibility;
|
|
|
|
out vec4 out_Color;
|
|
|
|
uniform sampler2D backgroundTexture;
|
|
uniform sampler2D rTexture;
|
|
uniform sampler2D gTexture;
|
|
uniform sampler2D bTexture;
|
|
uniform sampler2D blendMap;
|
|
|
|
uniform vec3 lightColour[4];
|
|
uniform vec3 lightAttenuation[4];
|
|
uniform float reflectivity;
|
|
uniform float shineDamper;
|
|
uniform vec3 skyColor;
|
|
|
|
|
|
void main(void) {
|
|
|
|
vec4 blendMapColour = texture(blendMap, pass_textureCoordinates);
|
|
|
|
float backTextureAmount = 1 - (blendMapColour.r + blendMapColour.g + blendMapColour.b);
|
|
vec2 tiledCoords = pass_textureCoordinates * 40.0;
|
|
vec4 backgroundTextureColour = texture(backgroundTexture, tiledCoords) * backTextureAmount;
|
|
vec4 rTextureColour = texture(rTexture, tiledCoords) * blendMapColour.r;
|
|
vec4 gTextureColour = texture(gTexture, tiledCoords) * blendMapColour.g;
|
|
vec4 bTextureColour = texture(bTexture, tiledCoords) * blendMapColour.b;
|
|
|
|
vec4 totalColour = backgroundTextureColour + rTextureColour + gTextureColour + bTextureColour;
|
|
|
|
vec3 unitNormal = normalize(surfaceNormal);
|
|
|
|
vec3 totalDiffuse = vec3(0.0);
|
|
vec3 totalSpecular = vec3(0.0);
|
|
for(int i=0;i<4;i++) {
|
|
float distance = length(toLightVector[i]);
|
|
float attenuationFactor = lightAttenuation[i].x + (lightAttenuation[i].y * distance) + (lightAttenuation[i].z * distance * distance);
|
|
vec3 unitLightVector = normalize(toLightVector[i]);
|
|
|
|
float nDot1 = dot(unitNormal, unitLightVector);
|
|
float brightness = max(nDot1, 0.0);
|
|
|
|
vec3 unitVectorToCamera = normalize(toCameraVector);
|
|
vec3 lightDirection = -unitLightVector;
|
|
vec3 reflectedLightDirection = reflect(lightDirection, unitNormal);
|
|
|
|
float specularFactor = dot(reflectedLightDirection, unitVectorToCamera);
|
|
specularFactor = max(specularFactor, 0.0);
|
|
float damperFactor = pow(specularFactor, shineDamper);
|
|
vec3 diffuse = (brightness * lightColour[i]) / attenuationFactor;
|
|
vec3 finalSpecular = (damperFactor * reflectivity * lightColour[i]) / attenuationFactor;
|
|
totalDiffuse = totalDiffuse + diffuse;
|
|
totalSpecular = totalSpecular + finalSpecular;
|
|
}
|
|
// the 0.2 represent the ambiant lightning ==> maybe set an uniform for this
|
|
totalDiffuse = max (totalDiffuse, 0.2);
|
|
|
|
out_Color = vec4(totalDiffuse,1.0) * totalColour + vec4(totalSpecular, 1.0);
|
|
out_Color = mix(vec4(skyColor,1.0), out_Color, visibility);
|
|
}
|
|
|