rendering: formalize main light shadow bias settings

This commit is contained in:
2026-04-13 01:40:29 +08:00
parent 2ee74e7761
commit 1d6f2e290d
11 changed files with 113 additions and 26 deletions

View File

@@ -5,6 +5,7 @@
#include <XCEngine/Core/Math/Vector4.h>
#include <XCEngine/Rendering/FrameData/RenderCameraData.h>
#include <XCEngine/Rendering/FrameData/RenderEnvironmentData.h>
#include <XCEngine/Rendering/Shadow/DirectionalShadowSettings.h>
#include <XCEngine/Rendering/FrameData/VisibleGaussianSplatItem.h>
#include <XCEngine/Rendering/FrameData/VisibleRenderItem.h>
#include <XCEngine/Rendering/FrameData/VisibleVolumeItem.h>
@@ -63,20 +64,23 @@ static_assert(
struct RenderDirectionalShadowSamplingData {
float enabled = 0.0f;
float receiverDepthBias = 0.0f;
float normalBiasScale = 0.0f;
float shadowStrength = 0.0f;
DirectionalShadowSamplingSettings settings = {};
};
static_assert(
sizeof(RenderDirectionalShadowSamplingData) == sizeof(float) * 4u,
"RenderDirectionalShadowSamplingData must stay float4-sized for GPU constant layout");
struct RenderDirectionalShadowCasterBiasData {
DirectionalShadowCasterBiasSettings settings = {};
};
struct RenderDirectionalShadowData {
bool enabled = false;
Math::Matrix4x4 viewProjection = Math::Matrix4x4::Identity();
RenderDirectionalShadowMapMetrics mapMetrics = {};
RenderDirectionalShadowSamplingData sampling = {};
RenderDirectionalShadowCasterBiasData casterBias = {};
RHI::RHIResourceView* shadowMap = nullptr;
bool IsValid() const {

View File

@@ -171,6 +171,10 @@ private:
ResolvedShaderPass ResolveSurfaceShaderPass(
const RenderSceneData& sceneData,
const Resources::Material* material) const;
Resources::MaterialRenderState ResolveEffectiveDepthRenderState(
const Resources::ShaderPass* shaderPass,
const Resources::Material* material,
const RenderSceneData& sceneData) const;
bool TryBuildSupportedBindingPlan(
const Resources::ShaderPass& shaderPass,
BuiltinPassResourceBindingPlan& outPlan,

View File

@@ -5,6 +5,7 @@
#include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/Rendering/RenderPass.h>
#include <XCEngine/Rendering/RenderSurface.h>
#include <XCEngine/Rendering/Shadow/DirectionalShadowSettings.h>
#include <array>
#include <cstdint>
@@ -131,6 +132,8 @@ struct DirectionalShadowRenderPlan {
float texelWorldSize = 0.0f;
float nearClipPlane = 0.1f;
float farClipPlane = 0.0f;
DirectionalShadowSamplingSettings sampling = {};
DirectionalShadowCasterBiasSettings casterBias = {};
uint32_t mapWidth = 0;
uint32_t mapHeight = 0;
RenderCameraData cameraData = {};

View File

@@ -12,9 +12,9 @@ class Scene;
namespace Rendering {
// Planning-only knobs for fitting the single main-light shadow camera to the
// current view. Receiver-side bias/filtering parameters live in runtime shadow
// data and are not configured here.
// Planner-owned knobs for the single main-light shadow, including both camera
// fitting and the default sampling / caster bias values emitted into the
// runtime shadow contract.
struct DirectionalShadowPlanningSettings {
uint32_t mapDimension = 1024u;
float minFocusDistance = 5.0f;
@@ -24,6 +24,8 @@ struct DirectionalShadowPlanningSettings {
float minDepthRange = 20.0f;
float boundsPadding = 1.0f;
float minDepthPadding = 2.0f;
DirectionalShadowSamplingSettings sampling = {};
DirectionalShadowCasterBiasSettings casterBias = {};
};
class SceneRenderRequestPlanner {

View File

@@ -0,0 +1,20 @@
#pragma once
#include <cstdint>
namespace XCEngine {
namespace Rendering {
struct DirectionalShadowSamplingSettings {
float receiverDepthBias = 0.0015f;
float normalBiasScale = 1.5f;
float shadowStrength = 0.85f;
};
struct DirectionalShadowCasterBiasSettings {
float depthBiasFactor = 1.0f;
int32_t depthBiasUnits = 2;
};
} // namespace Rendering
} // namespace XCEngine