diff --git a/imgui.ini b/imgui.ini index 925f5a5..d94e65f 100644 --- a/imgui.ini +++ b/imgui.ini @@ -9,7 +9,7 @@ Size=894,195 Collapsed=0 [Window][Debug Utils] -Pos=14,6 +Pos=13,15 Size=863,335 Collapsed=0 diff --git a/res/shaders/basic.frag b/res/shaders/basic.frag index 6d9f1a6..14dafe3 100644 --- a/res/shaders/basic.frag +++ b/res/shaders/basic.frag @@ -78,7 +78,7 @@ void computeShading( float computeAttenuation(vec3 lightPos, vec3 fragPos, float K_q); -float computeShadows(vec4 fragPosLightSpace); +float computeShadows(vec4 fragPosLightSpace, vec3 normal, vec3 lightDir); void main() { @@ -93,10 +93,6 @@ void main() { fragmentColor += pointLightContribution(u_pointLight[i], normal, v_fragmentPosition, viewDir); } - // This is not final: ambient lighting should not be affected of shadows. - float shadows = computeShadows(v_fragmentPositionLightSpace); - fragmentColor *= (1.0f - shadows); - //fragmentColor += spotLightContribution(u_spotLight, normal, v_fragmentPosition, viewDir); f_color = vec4(fragmentColor, 1.0f); @@ -114,7 +110,9 @@ vec3 directionalLightContribution(DirectionalLight light, vec3 normal, vec3 view vec3 ambient, diffuse, specular; computeShading(light.ambient, light.diffuse, light.specular, lightDir, viewDir, normal, ambient, diffuse, specular); - return (ambient + diffuse + specular) * 1.0f; + float shadows = computeShadows(v_fragmentPositionLightSpace, normal, lightDir); + + return (ambient + (1.0f - shadows) * (diffuse + specular)) * 1.0f; } vec3 pointLightContribution(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir) { @@ -191,7 +189,7 @@ float computeAttenuation(vec3 lightPos, vec3 fragPos, float K_q) { } -float computeShadows(vec4 fragPosLightSpace) { +float computeShadows(vec4 fragPosLightSpace, vec3 normal, vec3 lightDir) { // Perspective divide vec3 projCoords = fragPosLightSpace.xyz / fragPosLightSpace.w; @@ -200,10 +198,25 @@ float computeShadows(vec4 fragPosLightSpace) { projCoords *= 0.5f; projCoords += 0.5f; + if(projCoords.z > 1.0f) return 0.0f; + float closestDepth = texture(u_texture_shadowMap, projCoords.xy).r; float currentDepth = projCoords.z; - float shadow = currentDepth > closestDepth ? 1.0 : 0.0; + float bias = max(0.05 * (1.0 - dot(normal, lightDir)), 0.005); + + float shadow = 0.0; + vec2 texelSize = 1.0 / textureSize(u_texture_shadowMap, 0); + for(int x = -1; x <= 1; ++x) + { + for(int y = -1; y <= 1; ++y) + { + float pcfDepth = texture(u_texture_shadowMap, projCoords.xy + vec2(x, y) * texelSize).r; + shadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0; + } + } + shadow /= 9.0; + return shadow; } diff --git a/res/shaders/shadowDepth.frag b/res/shaders/shadowDepth.frag index 6087418..85f2da4 100644 --- a/res/shaders/shadowDepth.frag +++ b/res/shaders/shadowDepth.frag @@ -2,4 +2,6 @@ void main() { + // Empty as we aren't rendering to any color buffer + } \ No newline at end of file diff --git a/src/World.cpp b/src/World.cpp index d686489..af0697f 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -79,17 +79,22 @@ void World::calculateShadows(ShaderProgram *p_shaderProgram) { glClear(GL_DEPTH_BUFFER_BIT); // ConfigureShaderAndMatrices(); - float near_plane = 0.1f, far_plane = 7.5f; + float near_plane = 1.0f, far_plane = 15.0f; glm::mat4 lightProjection = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane); - glm::mat4 lightView = glm::lookAt(-glm::vec3(-0.2f, -1.0f, -0.3f), glm::vec3( 0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 1.0f, 0.0f)); + glm::mat4 lightView = glm::lookAt(-5.0f * glm::vec3(-0.2f, -1.0f, -0.3f), glm::vec3( 0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, 1.0f, 0.0f)); glm::mat4 lightViewProjectionMatrix = lightProjection * lightView; + // Switch face culling (Peter panning) + glCullFace(GL_BACK); + // Draw scene from light perspective // Draw all entities for(auto it = entities.begin(); it != entities.end(); it++) { it->drawShadows(lightViewProjectionMatrix, p_shaderProgram); } + glCullFace(GL_FRONT); + depthMapFBO.unbind(); // Reset viewport size diff --git a/src/World.h b/src/World.h index 28e8aef..8f89b8b 100644 --- a/src/World.h +++ b/src/World.h @@ -40,7 +40,7 @@ private: //SpotLight spotLight; // Shadows - const int SHADOW_RES = 1024; + const int SHADOW_RES = 4096; DepthMap depthMapFBO; };