diff --git a/modules/base/rendering/renderablemodel.cpp b/modules/base/rendering/renderablemodel.cpp index bcb39ce0aa..7a05667f62 100644 --- a/modules/base/rendering/renderablemodel.cpp +++ b/modules/base/rendering/renderablemodel.cpp @@ -1217,6 +1217,9 @@ RenderableModel::DepthMapData RenderableModel::renderDepthMap() const { GLint prevVp[4]; glGetIntegerv(GL_VIEWPORT, prevVp); + GLint prevCullface; + glGetIntegerv(GL_CULL_FACE_MODE, &prevCullface); + _depthMapProgram->activate(); const double size = boundingSphere(); @@ -1251,12 +1254,14 @@ RenderableModel::DepthMapData RenderableModel::renderDepthMap() const { glBindFramebuffer(GL_FRAMEBUFFER, _depthMapFBO); glViewport(0, 0, _depthMapResolution.x, _depthMapResolution.y); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glCullFace(GL_FRONT); _geometry->render(*_depthMapProgram, false, true); glUseProgram(prevProg); glBindFramebuffer(GL_FRAMEBUFFER, prevFbo); glViewport(prevVp[0], prevVp[1], prevVp[2], prevVp[3]); + glCullFace(static_cast(prevCullface)); return { viewProjection, _depthMap }; } diff --git a/modules/globebrowsing/shaders/renderer_fs.glsl b/modules/globebrowsing/shaders/renderer_fs.glsl index 2bce52560b..00331e4fc1 100644 --- a/modules/globebrowsing/shaders/renderer_fs.glsl +++ b/modules/globebrowsing/shaders/renderer_fs.glsl @@ -298,13 +298,14 @@ Fragment getFragment() { #endif #if USE_DEPTHMAP_SHADOWS + const float bias = 0.005; bool shadowed = false; for (int idx = 0; idx < n_depthmaps; ++idx) { vec3 coords = positions_lightspace[idx].xyz / positions_lightspace[idx].w; coords = coords * 0.5 + 0.5; float sampled_depth = texture(light_depth_maps[idx], coords.xy).r; float current_depth = coords.z; - if (current_depth > sampled_depth) { + if (current_depth < 1.0 && current_depth - bias > sampled_depth) { shadowed = true; } }