74 lines
2.2 KiB
GLSL
74 lines
2.2 KiB
GLSL
|
#version 430 core
|
||
|
|
||
|
uniform sampler2D colorTexture;
|
||
|
uniform sampler2D clouds;
|
||
|
|
||
|
uniform vec3 sunPos;
|
||
|
uniform vec3 sunColor;
|
||
|
uniform float sunLightExp;
|
||
|
|
||
|
uniform vec3 cameraPos;
|
||
|
uniform float time;
|
||
|
|
||
|
uniform vec3 reflectorPos;
|
||
|
uniform vec3 reflectorDir;
|
||
|
uniform vec3 reflectorColor;
|
||
|
uniform float reflectorAngle;
|
||
|
uniform float reflectorLightExp;
|
||
|
|
||
|
vec3 normalizedVertexNormal;
|
||
|
|
||
|
in vec3 vertexNormalOut;
|
||
|
in vec3 vertexPosOut;
|
||
|
in vec2 vertexTexCoordOut;
|
||
|
|
||
|
out vec4 outColor;
|
||
|
|
||
|
vec4 calcPointLight(vec3 fragColor, vec3 lightPos, vec3 lightColor, float lightExp) {
|
||
|
vec3 lightDir = normalize(vertexPosOut - lightPos);
|
||
|
float lightDistance = length(vertexPosOut - lightPos);
|
||
|
vec3 newLightColor = lightColor / pow(lightDistance, 2);
|
||
|
|
||
|
float intensity = dot(normalizedVertexNormal, -lightDir);
|
||
|
intensity = max(intensity, 0.0);
|
||
|
|
||
|
vec3 viewDir = normalize(cameraPos - vertexPosOut);
|
||
|
vec3 reflectDir = reflect(lightDir, normalizedVertexNormal);
|
||
|
|
||
|
float glossPow = 8;
|
||
|
float specular = pow(max(dot(viewDir, reflectDir), 0.0), glossPow);
|
||
|
|
||
|
float diffuse = intensity;
|
||
|
vec3 resultColor = newLightColor * (fragColor * diffuse + specular );
|
||
|
return vec4(1 - exp(-resultColor * lightExp), 1.0);
|
||
|
}
|
||
|
|
||
|
vec4 calcSpotLight(vec3 fragColor, vec3 lightPos, vec3 lightColor, vec3 lightDir,
|
||
|
float innerCutOff, float outerCutOff, float lightExp) {
|
||
|
vec3 lightToFragDir = normalize(vertexPosOut - lightPos);
|
||
|
float angleCos = dot(lightToFragDir, lightDir);
|
||
|
float epsilon = cos(innerCutOff) - cos(outerCutOff);
|
||
|
vec4 res = vec4(0, 0, 0, 1);
|
||
|
if (angleCos > cos(outerCutOff)) {
|
||
|
float intensity = clamp((angleCos - cos(outerCutOff)) / epsilon, 0.0, 1.0);
|
||
|
res = calcPointLight(fragColor, lightPos, lightColor, reflectorLightExp * intensity);
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
vec3 textureColor = texture2D(colorTexture, vertexTexCoordOut).rgb;
|
||
|
vec3 cloudColor = texture2D(clouds, vertexTexCoordOut).rgb;
|
||
|
|
||
|
textureColor = mix(vec3(1), textureColor, cloudColor.r);
|
||
|
|
||
|
normalizedVertexNormal = normalize(vertexNormalOut);
|
||
|
|
||
|
outColor = calcPointLight(textureColor, sunPos, sunColor, sunLightExp);
|
||
|
|
||
|
outColor += calcSpotLight(textureColor, reflectorPos, reflectorColor, reflectorDir,
|
||
|
reflectorAngle, reflectorAngle + radians(10), reflectorLightExp);
|
||
|
|
||
|
}
|