diff --git a/Shader/bump.fs b/Shader/bump.fs index f46baeb..046d1fd 100644 --- a/Shader/bump.fs +++ b/Shader/bump.fs @@ -77,7 +77,7 @@ float get_shadow(vec4 fragPosLightSpace, vec3 normal) { vec2 moments = texture(shadowMap, projCoords.xy).rg; // get closest depth value from light's perspective (using [0,1] range fragPosLight as coords) - mediump float closestDepth = texture(shadowMap, projCoords.xy).r; + mediump float closestDepth = moments.r; // get depth of current fragment from light's perspective mediump float currentDepth = projCoords.z; // check whether current frag pos is in shadow @@ -85,9 +85,9 @@ float get_shadow(vec4 fragPosLightSpace, vec3 normal) { // We divide by this later, so make sure it's not exactly 0 // It seems like it should always be 0.0, but due to interpolation it's not -- it increases with the deviation! // A larger second parameter to max() means more blur (but also more light bleeding) - float variance = max(moments.y - moments.x * moments.x, 0.0005); + float variance = max(moments.y - moments.x * moments.x, (currentDepth - closestDepth) * 0.05); - float d = projCoords.z - moments.x * 1.0; // bias should be "compare", what is that? + float d = projCoords.z - moments.x * 1.0; // Use linear_step to prevent light bleeding float p_max = linear_step(0.2, 1.0, variance / (variance + d * d)); diff --git a/include/Gedeng/DirectionalLight.h b/include/Gedeng/DirectionalLight.h index ba6d54e..1cfdb02 100644 --- a/include/Gedeng/DirectionalLight.h +++ b/include/Gedeng/DirectionalLight.h @@ -10,28 +10,6 @@ class DirectionalLight { public: glm::vec3 direction; - DirectionalLight() : shadow_shader(Gedeng::Shader("Shader/shadow.vs", "Shader/shadow.fs")) { - // Configure depth map - glGenFramebuffers(1, &depth_map_fbo); - - // Create depth texture - glGenTextures(1, &depth_map); - glBindTexture(GL_TEXTURE_2D, depth_map); - // R and G with 32 bit floats: stores mean and variance - glTexImage2D(GL_TEXTURE_2D, 0, GL_RG32F, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - - // Attach depth texture as FBO's depth buffer - glBindFramebuffer(GL_FRAMEBUFFER, depth_map_fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, depth_map, 0); - glDrawBuffer(GL_NONE); - glReadBuffer(GL_NONE); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } - explicit DirectionalLight(glm::vec3 direction) // TODO: Avoid all this duplication : direction(direction), shadow_shader(Gedeng::Shader("Shader/shadow.vs", "Shader/shadow.fs")) {