diff --git a/engine/include/XCEngine/Rendering/AGENTS.md b/engine/include/XCEngine/Rendering/AGENTS.md index 6a105a29..045186ba 100644 --- a/engine/include/XCEngine/Rendering/AGENTS.md +++ b/engine/include/XCEngine/Rendering/AGENTS.md @@ -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 测试通过。 diff --git a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp index c9318b97..10c60c30 100644 --- a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp +++ b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp @@ -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(