From d14ebdc0e137341e00c7eed7155def480a5a9b44 Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Tue, 14 Nov 2017 18:53:50 +0100 Subject: [PATCH] Adjusted cascade partitions --- .../render-utils/src/DebugDeferredBuffer.cpp | 1 - .../render-utils/src/RenderShadowTask.cpp | 21 ++++++++++++------- libraries/render-utils/src/ShadowCore.slh | 5 ++--- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 7d316d6e56..eda6c69f88 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -497,7 +497,6 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I const glm::vec2 topRight(_size.z, _size.w); geometryBuffer->renderQuad(batch, bottomLeft, topRight, color, _geometryId); - batch.setResourceTexture(Albedo, nullptr); batch.setResourceTexture(Normal, nullptr); batch.setResourceTexture(Specular, nullptr); diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index 88b3fe9013..c140d85560 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -260,16 +260,23 @@ void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, O const auto farClip = args->getViewFrustum().getFarClip(); const auto nearDepth = -args->_boomOffset.z; - static const float SHADOW_MAX_DISTANCE = 30.0f; - static const float CASCADE_LEVEL_SCALE = 2.0f; - float maxCascadeDistance = SHADOW_MAX_DISTANCE / powf(CASCADE_LEVEL_SCALE, globalShadow->getCascadeCount() - 1 - _cascadeIndex); - float minCascadeDistance = maxCascadeDistance / CASCADE_LEVEL_SCALE; - float shadowOverlapDistance = (maxCascadeDistance - minCascadeDistance) / 3.0f; + static const float HIGH_CASCADE_MAX_DISTANCE = 20.0f; + float maxCascadeDistance = HIGH_CASCADE_MAX_DISTANCE; + float minCascadeDistance = nearClip; + float shadowOverlapDistance = 0.0f; + if (globalShadow->getCascadeCount() > 1) { + static const float LOW_CASCADE_MAX_DISTANCE = 2.0f; + const float cascadeLevelScale = powf(HIGH_CASCADE_MAX_DISTANCE / LOW_CASCADE_MAX_DISTANCE, 1.0f / (globalShadow->getCascadeCount() - 1)); + + maxCascadeDistance = HIGH_CASCADE_MAX_DISTANCE / powf(cascadeLevelScale, globalShadow->getCascadeCount() - 1 - _cascadeIndex); + minCascadeDistance = maxCascadeDistance / cascadeLevelScale; + } + + shadowOverlapDistance = (maxCascadeDistance - minCascadeDistance) / 3.0f; + maxCascadeDistance += shadowOverlapDistance; if (_cascadeIndex == 0) { minCascadeDistance = nearDepth; - } else { - minCascadeDistance -= shadowOverlapDistance; } minCascadeDistance = std::max(minCascadeDistance, nearDepth); maxCascadeDistance = std::min(maxCascadeDistance, farClip); diff --git a/libraries/render-utils/src/ShadowCore.slh b/libraries/render-utils/src/ShadowCore.slh index 6408ad472a..e548af6a79 100644 --- a/libraries/render-utils/src/ShadowCore.slh +++ b/libraries/render-utils/src/ShadowCore.slh @@ -43,10 +43,9 @@ float getShadowBias(int cascadeIndex) { // Compute the texture coordinates from world coordinates vec4 evalShadowTexcoord(int cascadeIndex, vec4 position) { - float bias = -getShadowBias(cascadeIndex); - vec4 shadowCoord = getShadowReprojection(cascadeIndex) * position; - return vec4(shadowCoord.xy, shadowCoord.z + bias, 1.0); + float bias = getShadowBias(cascadeIndex); + return vec4(shadowCoord.xy, shadowCoord.z - bias, 1.0); } int getFirstValidShadowTexcoord(vec4 cascadeShadowCoords[4]) {