rendering: tune main light shadow bias defaults

This commit is contained in:
2026-04-13 02:24:14 +08:00
parent b7428b0ef1
commit 00875e0c90
3 changed files with 13 additions and 9 deletions

View File

@@ -6,14 +6,18 @@ namespace XCEngine {
namespace Rendering { namespace Rendering {
struct DirectionalShadowSamplingSettings { struct DirectionalShadowSamplingSettings {
float receiverDepthBias = 0.0015f; // Keep receiver bias modest and rely more on caster / normal bias so
float normalBiasScale = 1.5f; // contact shadows do not detach too aggressively.
float receiverDepthBias = 0.0010f;
float normalBiasScale = 2.0f;
float shadowStrength = 0.85f; float shadowStrength = 0.85f;
}; };
struct DirectionalShadowCasterBiasSettings { struct DirectionalShadowCasterBiasSettings {
float depthBiasFactor = 1.0f; // Single-map directional shadows need a stronger raster bias baseline than
int32_t depthBiasUnits = 2; // the previous placeholder values to keep acne under control.
float depthBiasFactor = 2.5f;
int32_t depthBiasUnits = 4;
}; };
} // namespace Rendering } // namespace Rendering

View File

@@ -1340,7 +1340,7 @@ TEST(CameraRenderer_Test, AutoAllocatesDirectionalShadowSurfaceFromShadowPlan) {
EXPECT_FLOAT_EQ(pipelineState->lastShadowViewProjection.m[0][3], 11.0f); 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[1][3], 12.0f);
EXPECT_FLOAT_EQ(pipelineState->lastShadowViewProjection.m[2][3], 13.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.x, 1.0f / 256.0f);
EXPECT_FLOAT_EQ(pipelineState->lastShadowMapMetrics.inverseMapSize.y, 1.0f / 128.0f); EXPECT_FLOAT_EQ(pipelineState->lastShadowMapMetrics.inverseMapSize.y, 1.0f / 128.0f);
EXPECT_FLOAT_EQ(pipelineState->lastShadowSampling.settings.shadowStrength, 0.85f); EXPECT_FLOAT_EQ(pipelineState->lastShadowSampling.settings.shadowStrength, 0.85f);

View File

@@ -285,9 +285,9 @@ TEST(SceneRenderRequestPlanner_Test, SanitizesInvalidDirectionalShadowPlanningSe
EXPECT_FLOAT_EQ(settings.minDepthRange, 20.0f); EXPECT_FLOAT_EQ(settings.minDepthRange, 20.0f);
EXPECT_FLOAT_EQ(settings.boundsPadding, 1.0f); EXPECT_FLOAT_EQ(settings.boundsPadding, 1.0f);
EXPECT_FLOAT_EQ(settings.minDepthPadding, 2.0f); EXPECT_FLOAT_EQ(settings.minDepthPadding, 2.0f);
EXPECT_FLOAT_EQ(settings.sampling.receiverDepthBias, 0.0015f); EXPECT_FLOAT_EQ(settings.sampling.receiverDepthBias, 0.0010f);
EXPECT_FLOAT_EQ(settings.sampling.normalBiasScale, 1.5f); EXPECT_FLOAT_EQ(settings.sampling.normalBiasScale, 2.0f);
EXPECT_FLOAT_EQ(settings.sampling.shadowStrength, 1.0f); EXPECT_FLOAT_EQ(settings.sampling.shadowStrength, 1.0f);
EXPECT_FLOAT_EQ(settings.casterBias.depthBiasFactor, 1.0f); EXPECT_FLOAT_EQ(settings.casterBias.depthBiasFactor, 2.5f);
EXPECT_EQ(settings.casterBias.depthBiasUnits, 2); EXPECT_EQ(settings.casterBias.depthBiasUnits, 4);
} }