Align managed SRP camera request planning

This commit is contained in:
2026-04-26 17:49:51 +08:00
parent a89b5c9aec
commit 703eaa3b8e
2 changed files with 21 additions and 24 deletions

View File

@@ -107,6 +107,7 @@ SceneRenderer
`DefaultSceneRendererUsesManagedUniversalPipelineForPlannedMainSceneAndPostProcessRender` 保证 managed URP 通过显式 renderer/pass 录制主场景和后处理。
`ManagedRenderContextExposes*ThroughRenderingData` 保证 managed renderer 可通过 `RenderingData` 观察 camera / lighting / shadow / environment / final color / stage color 数据。
`ManagedStageRecorderRecordsMainSceneThroughScriptableRenderContext` 保证主场景通过 `ScriptableRenderContext` 的显式 draw 能力录制。
`ScriptCoreUniversalRendererFeatureConfiguresCameraRequestPolicy` 保证 URP renderer feature 能通过产品层相机请求策略真正禁用 native 默认方向光阴影规划。
## 10. 后续演进方向
- 继续补齐 URP 上层组织能力,但不能破坏 builtin / programmable 的显式切换语义。
@@ -119,4 +120,5 @@ SceneRenderer
- 确立 managed 公开层只通过 `DrawRenderers(...)``DrawSkybox()``DrawOpaqueRenderers()``DrawTransparentRenderers()` 表达 native draw 能力pass / feature / stage 的组织权归 managed SRP / URP。
- `ScriptableRenderer` 统一驱动 renderer feature 的 frame-plan、scene-setup、directional-shadow execution 配置;`RendererBackedRenderPipelineAsset` 清掉 native 默认 optional stage 后再让 renderer / feature 显式请求。
- `CameraRenderRequestContext.hasDirectionalShadow``ClearDirectionalShadow()` 从 ScriptCore public surface 收回 internal避免 core public API 泄漏 native shadow 规划控制。
- 收口 managed 相机请求策略顺序:`MonoManagedRenderPipelineAssetRuntime::ConfigureCameraRenderRequest` 先生成 native 默认方向光阴影基线给 managed / URP 观察,再按 managed 最终策略重算或清除,避免 `ClearDirectionalShadow()` 之后又被 native 默认规划补回。
- 当时验证:`xcengine_managed_assemblies``scripting_tests` 构建通过;聚焦 `MonoScriptRuntimeTest` 12 项 SRP / URP / API surface 测试通过。

View File

@@ -2104,13 +2104,21 @@ void MonoManagedRenderPipelineAssetRuntime::ConfigureCameraRenderRequest(
size_t renderedRequestCount,
const Rendering::DirectionalShadowPlanningSettings&
directionalShadowSettings) const {
const auto applyDefaultDirectionalShadowPolicy =
[&request,
renderedBaseCameraCount,
renderedRequestCount](
const Rendering::DirectionalShadowPlanningSettings& settings) {
request.directionalShadow = {};
Rendering::ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
settings);
};
if (!EnsureManagedAsset()) {
request.directionalShadow = {};
Rendering::ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
directionalShadowSettings);
applyDefaultDirectionalShadowPolicy(directionalShadowSettings);
return;
}
@@ -2118,12 +2126,7 @@ void MonoManagedRenderPipelineAssetRuntime::ConfigureCameraRenderRequest(
MonoMethod* const method =
ResolveConfigureCameraRenderRequestMethod(assetObject);
if (assetObject == nullptr || method == nullptr) {
request.directionalShadow = {};
Rendering::ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
directionalShadowSettings);
applyDefaultDirectionalShadowPolicy(directionalShadowSettings);
return;
}
@@ -2134,6 +2137,8 @@ void MonoManagedRenderPipelineAssetRuntime::ConfigureCameraRenderRequest(
requestContextState.renderedRequestCount = renderedRequestCount;
requestContextState.directionalShadowPlanningSettings =
directionalShadowSettings;
applyDefaultDirectionalShadowPolicy(
requestContextState.directionalShadowPlanningSettings);
const uint64_t requestContextHandle =
RegisterManagedCameraRenderRequestContextState(
requestContextState);
@@ -2143,12 +2148,6 @@ void MonoManagedRenderPipelineAssetRuntime::ConfigureCameraRenderRequest(
if (requestContextObject == nullptr) {
UnregisterManagedCameraRenderRequestContextState(
requestContextHandle);
request.directionalShadow = {};
Rendering::ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
directionalShadowSettings);
return;
}
@@ -2159,12 +2158,8 @@ void MonoManagedRenderPipelineAssetRuntime::ConfigureCameraRenderRequest(
args,
nullptr);
request.directionalShadow = {};
if (requestContextState.suppressDirectionalShadow) {
} else {
Rendering::ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
if (!requestContextState.suppressDirectionalShadow) {
applyDefaultDirectionalShadowPolicy(
requestContextState.directionalShadowPlanningSettings);
}
UnregisterManagedCameraRenderRequestContextState(