#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); }