71 lines
2.7 KiB
GLSL
71 lines
2.7 KiB
GLSL
#version 330 core
|
|
out vec4 FragColor;
|
|
|
|
uniform vec3 lightColor;
|
|
uniform vec3 lightPos;
|
|
uniform vec3 viewPos;
|
|
|
|
uniform sampler2D diffuseTexture;
|
|
uniform samplerCube depthMap;
|
|
|
|
uniform float far_plane;
|
|
uniform bool shadows;
|
|
|
|
uniform vec3 iResolution; // viewport resolution (in pixels)
|
|
uniform float iTime; // shader playback time (in seconds)
|
|
uniform float iTimeDelta; // render time (in seconds)
|
|
uniform float iFrameRate; // shader frame rate
|
|
uniform int iFrame; // shader playback frame
|
|
uniform float iChannelTime[4]; // channel playback time (in seconds)
|
|
uniform vec3 iChannelResolution[4]; // channel resolution (in pixels)
|
|
uniform vec4 iMouse; // mouse pixel coords. xy: current (if MLB down), zw: click
|
|
uniform sampler2D iChannel0; // input channel. XX = 2D/Cube
|
|
uniform vec4 iDate; // (year, month, day, time in seconds)
|
|
|
|
in vec3 FragPos;
|
|
in vec3 Normal;
|
|
in vec3 Color;
|
|
|
|
float ShadowCalculation(vec3 fragPos)
|
|
{
|
|
// get vector between fragment position and light position
|
|
vec3 fragToLight = fragPos - lightPos;
|
|
// ise the fragment to light vector to sample from the depth map
|
|
float closestDepth = texture(depthMap, fragToLight).r;
|
|
// it is currently in linear range between [0,1], let's re-transform it back to original depth value
|
|
closestDepth *= far_plane;
|
|
// now get current linear depth as the length between the fragment and light position
|
|
float currentDepth = length(fragToLight);
|
|
// test for shadows
|
|
float bias = 0.05; // we use a much larger bias since depth is now in [near_plane, far_plane] range
|
|
float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;
|
|
// display closestDepth as debug (to visualize depth cubemap)
|
|
//FragColor = vec4(vec3(closestDepth / far_plane), 1.0);
|
|
|
|
return shadow;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
//vec3 color = texture(diffuseTexture, FragPos.xy).rgb;
|
|
vec3 normal = normalize(Normal);
|
|
vec3 lightColor = vec3(0.3);
|
|
// ambient
|
|
vec3 ambient = 0.3 * lightColor;
|
|
// diffuse
|
|
vec3 lightDir = normalize(lightPos - FragPos);
|
|
float diff = max(dot(lightDir, normal), 0.0);
|
|
vec3 diffuse = diff * lightColor;
|
|
// specular
|
|
vec3 viewDir = normalize(viewPos - FragPos);
|
|
vec3 reflectDir = reflect(-lightDir, normal);
|
|
float spec = 0.0;
|
|
vec3 halfwayDir = normalize(lightDir + viewDir);
|
|
spec = pow(max(dot(normal, halfwayDir), 0.0), 64.0);
|
|
vec3 specular = spec * lightColor;
|
|
// calculate shadow
|
|
float shadow = ShadowCalculation(FragPos);
|
|
vec3 lighting = (ambient + (1.0 - shadow) * (diffuse + specular)) * Color;
|
|
|
|
FragColor = vec4(lighting, 1.0);
|
|
} |