diff --git a/engine/include/XCEngine/Rendering/Shadow/DirectionalShadowSettings.h b/engine/include/XCEngine/Rendering/Shadow/DirectionalShadowSettings.h index c6c5e6c8..f523b35d 100644 --- a/engine/include/XCEngine/Rendering/Shadow/DirectionalShadowSettings.h +++ b/engine/include/XCEngine/Rendering/Shadow/DirectionalShadowSettings.h @@ -6,14 +6,18 @@ namespace XCEngine { namespace Rendering { struct DirectionalShadowSamplingSettings { - float receiverDepthBias = 0.0015f; - float normalBiasScale = 1.5f; + // Keep receiver bias modest and rely more on caster / normal bias so + // contact shadows do not detach too aggressively. + float receiverDepthBias = 0.0010f; + float normalBiasScale = 2.0f; float shadowStrength = 0.85f; }; struct DirectionalShadowCasterBiasSettings { - float depthBiasFactor = 1.0f; - int32_t depthBiasUnits = 2; + // Single-map directional shadows need a stronger raster bias baseline than + // the previous placeholder values to keep acne under control. + float depthBiasFactor = 2.5f; + int32_t depthBiasUnits = 4; }; } // namespace Rendering diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 538aa47c..967e9be0 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -1340,7 +1340,7 @@ TEST(CameraRenderer_Test, AutoAllocatesDirectionalShadowSurfaceFromShadowPlan) { EXPECT_FLOAT_EQ(pipelineState->lastShadowViewProjection.m[0][3], 11.0f); EXPECT_FLOAT_EQ(pipelineState->lastShadowViewProjection.m[1][3], 12.0f); EXPECT_FLOAT_EQ(pipelineState->lastShadowViewProjection.m[2][3], 13.0f); - EXPECT_FLOAT_EQ(pipelineState->lastShadowSampling.settings.receiverDepthBias, 0.0015f); + EXPECT_FLOAT_EQ(pipelineState->lastShadowSampling.settings.receiverDepthBias, 0.0010f); EXPECT_FLOAT_EQ(pipelineState->lastShadowMapMetrics.inverseMapSize.x, 1.0f / 256.0f); EXPECT_FLOAT_EQ(pipelineState->lastShadowMapMetrics.inverseMapSize.y, 1.0f / 128.0f); EXPECT_FLOAT_EQ(pipelineState->lastShadowSampling.settings.shadowStrength, 0.85f); diff --git a/tests/Rendering/unit/test_scene_render_request_planner.cpp b/tests/Rendering/unit/test_scene_render_request_planner.cpp index dadb6ae7..20b02979 100644 --- a/tests/Rendering/unit/test_scene_render_request_planner.cpp +++ b/tests/Rendering/unit/test_scene_render_request_planner.cpp @@ -285,9 +285,9 @@ TEST(SceneRenderRequestPlanner_Test, SanitizesInvalidDirectionalShadowPlanningSe EXPECT_FLOAT_EQ(settings.minDepthRange, 20.0f); EXPECT_FLOAT_EQ(settings.boundsPadding, 1.0f); EXPECT_FLOAT_EQ(settings.minDepthPadding, 2.0f); - EXPECT_FLOAT_EQ(settings.sampling.receiverDepthBias, 0.0015f); - EXPECT_FLOAT_EQ(settings.sampling.normalBiasScale, 1.5f); + EXPECT_FLOAT_EQ(settings.sampling.receiverDepthBias, 0.0010f); + EXPECT_FLOAT_EQ(settings.sampling.normalBiasScale, 2.0f); EXPECT_FLOAT_EQ(settings.sampling.shadowStrength, 1.0f); - EXPECT_FLOAT_EQ(settings.casterBias.depthBiasFactor, 1.0f); - EXPECT_EQ(settings.casterBias.depthBiasUnits, 2); + EXPECT_FLOAT_EQ(settings.casterBias.depthBiasFactor, 2.5f); + EXPECT_EQ(settings.casterBias.depthBiasUnits, 4); }