Move scene request planning behind pipeline asset

This commit is contained in:
2026-04-29 03:29:17 +08:00
parent 313a571e43
commit 2fde2f16c2
10 changed files with 393 additions and 25 deletions

View File

@@ -52,8 +52,9 @@ Editor viewport 边界补充SceneViewport 的 render request 是 editor 每
```text
SceneRenderer
-> SceneRenderRequestPlanner::BuildRequests
-> RenderPipelineHost
-> RenderPipelineAsset::BuildSceneRenderRequests
-> (default) SceneRenderRequestPlanner::BuildRequests
-> CameraFramePlanBuilder
-> CameraRenderer
-> DirectionalShadowRuntime
@@ -66,9 +67,10 @@ SceneRenderer
职责边界:
- `SceneRenderer`:场景级入口,生成/排序 camera stack frame plans并委托执行不做 scene extraction不发 draw call
- `SceneRenderRequestPlanner`:收集可用相机、推导 viewport / clear / camera stack / directional shadow request不创建执行期临时资源
- `RenderPipelineHost`:把 requests 变成 frame plans / stack plans稳定排序并驱动 `CameraRenderer`
- `SceneRenderer`:场景级 façade只把 scene/override camera/context/surface 交给当前 pipeline host不再直接拥有 top-level request planner
- `RenderPipelineAsset`:顶层 scene/camera request authority。`BuildSceneRenderRequests(...)` 是对齐 Unity `RenderPipeline.Render(...)` 入口责任的首个 native 合约面;未来所有 SRP/URP 级 camera policy、camera list 裁剪、renderer routing、tooling request 安装,都必须先经过这里
- `SceneRenderRequestPlanner`:默认 native planning utility。它负责收集可用相机、推导 viewport / clear / camera stack / directional shadow request不再是顶层 authority而是 `RenderPipelineAsset::BuildSceneRenderRequests(...)` 的默认 fallback 实现
- `RenderPipelineHost`:向当前 asset 请求 scene render requests把 requests 变成 frame plans / stack plans稳定排序并驱动 `CameraRenderer`
- `CameraFramePlanBuilder`:从 `CameraRenderRequest``CameraFramePlan`,调用 `RenderPipelineAsset::ConfigureCameraFramePlan`
- `CameraRenderer`:单相机执行器,校验 plan解析 pipeline binding生成 shadow execution state抽取 `RenderSceneData`,交给 camera frame graph。
- `RenderPipeline` / `RenderPipelineBackend`:提供 scene setup、shadow execution setup、stage graph recording、fallback render。
@@ -98,7 +100,7 @@ SceneRenderer
- `UsesGraphManagedSceneColor``UsesGraphManagedOutputColor(stage)` 决定是否创建 graph-managed transient color。
- fullscreen stage 的 source 必须通过 `CameraFrameColorSource` 表达,不要用隐式全局变量猜输入。
不要绕过 `RenderPipelineAsset::ConfigureCameraRenderRequest``ConfigureCameraFramePlan`它们是 SRP/URP asset policy 对齐 Unity 的核心 hook。
不要绕过 `RenderPipelineAsset::BuildSceneRenderRequests``ConfigureCameraRenderRequest``ConfigureCameraFramePlan`顶层 request ingress、per-request policy、per-plan policy 现在都要先经过 asset contract是 SRP/URP asset policy 对齐 Unity 的核心 hook
## 4. Stage 模型
@@ -412,7 +414,7 @@ cmake --build build --config Debug --target rendering_phase_regression
1. 稳住 native RenderGraph / RHI / scene backend。
2. 让 managed SRP runtime 持有真实 asset / pipeline / renderer runtime。
3. 扩大 `ScriptableRenderContext` 和 managed RenderGraph 的受控能力面。
4. 把 URP-like 的 asset policy、renderer data、feature queue、render pass event、post/final/shadow policy 逐步上移到 managed。
4. 把 URP-like 的 top-level scene request planning、asset policy、renderer data、feature queue、render pass event、post/final/shadow policy 逐步上移到 managed。
5. 保持 `BuiltinForwardPipeline` 作为可被 SRP 调度的 native backend而不是重新变回唯一上层管线。
一句话XCEngine Rendering 的对齐目标是 Unity SRP/URP 的分层模型,不是复制 Unity 某个版本的源码细节。C++ 做执行内核C# 做可编排管线RenderGraph 做中间契约。

View File

@@ -2,11 +2,17 @@
#include <XCEngine/Rendering/Execution/CameraStackFramePlan.h>
#include <XCEngine/Rendering/Execution/CameraRenderer.h>
#include <XCEngine/Rendering/Planning/SceneRenderRequestPlanner.h>
#include <memory>
#include <vector>
namespace XCEngine {
namespace Components {
class CameraComponent;
class Scene;
} // namespace Components
namespace Rendering {
class CameraFramePlanBuilder;
@@ -20,9 +26,23 @@ public:
void SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
RenderPipeline* GetPipeline() const { return m_cameraRenderer.GetPipeline(); }
const RenderPipelineAsset* GetPipelineAsset() const { return m_cameraRenderer.GetPipelineAsset(); }
void SetDirectionalShadowPlanningSettings(
const DirectionalShadowPlanningSettings& settings);
const DirectionalShadowPlanningSettings&
GetDirectionalShadowPlanningSettings() const;
std::vector<CameraFramePlan> BuildFramePlans(
const Components::Scene& scene,
Components::CameraComponent* overrideCamera,
const RenderContext& context,
const RenderSurface& surface);
std::vector<CameraFramePlan> BuildFramePlans(
const std::vector<CameraRenderRequest>& requests);
std::vector<CameraStackFramePlan> BuildStackFramePlans(
const Components::Scene& scene,
Components::CameraComponent* overrideCamera,
const RenderContext& context,
const RenderSurface& surface);
std::vector<CameraStackFramePlan> BuildStackFramePlans(
const std::vector<CameraRenderRequest>& requests);
@@ -32,8 +52,15 @@ public:
bool Render(const std::vector<CameraStackFramePlan>& stackPlans);
private:
std::vector<CameraRenderRequest> BuildSceneRenderRequests(
const Components::Scene& scene,
Components::CameraComponent* overrideCamera,
const RenderContext& context,
const RenderSurface& surface) const;
CameraRenderer m_cameraRenderer;
std::unique_ptr<CameraFramePlanBuilder> m_framePlanBuilder;
SceneRenderRequestPlanner m_requestPlanner;
};
} // namespace Rendering

View File

@@ -2,7 +2,6 @@
#include <XCEngine/Rendering/Execution/CameraStackFramePlan.h>
#include <XCEngine/Rendering/Execution/RenderPipelineHost.h>
#include <XCEngine/Rendering/Planning/SceneRenderRequestPlanner.h>
#include <vector>
@@ -23,6 +22,10 @@ public:
void SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
RenderPipeline* GetPipeline() const { return m_pipelineHost.GetPipeline(); }
const RenderPipelineAsset* GetPipelineAsset() const { return m_pipelineHost.GetPipelineAsset(); }
void SetDirectionalShadowPlanningSettings(
const DirectionalShadowPlanningSettings& settings);
const DirectionalShadowPlanningSettings&
GetDirectionalShadowPlanningSettings() const;
std::vector<CameraFramePlan> BuildFramePlans(
const Components::Scene& scene,
@@ -45,7 +48,6 @@ public:
const RenderContext& context,
const RenderSurface& surface);
SceneRenderRequestPlanner m_requestPlanner;
RenderPipelineHost m_pipelineHost;
};

View File

@@ -7,8 +7,14 @@
#include <cstddef>
#include <memory>
#include <string>
#include <vector>
namespace XCEngine {
namespace Components {
class CameraComponent;
class Scene;
} // namespace Components
namespace Rendering {
struct CameraFramePlan;
@@ -68,6 +74,13 @@ public:
}
std::unique_ptr<RenderPipeline> CreatePipeline() const override;
std::vector<CameraRenderRequest> BuildSceneRenderRequests(
const Components::Scene& scene,
Components::CameraComponent* overrideCamera,
const RenderContext& context,
const RenderSurface& surface,
const DirectionalShadowPlanningSettings& directionalShadowSettings)
const override;
void ConfigureCameraRenderRequest(
CameraRenderRequest& request,
size_t renderedBaseCameraCount,
@@ -99,6 +112,15 @@ public:
return nullptr;
}
virtual bool BuildSceneRenderRequests(
const Components::Scene&,
Components::CameraComponent*,
const RenderContext&,
const RenderSurface&,
const DirectionalShadowPlanningSettings&,
std::vector<CameraRenderRequest>&) const {
return false;
}
virtual void ConfigureCameraRenderRequest(
CameraRenderRequest&,
size_t,

View File

@@ -1,20 +1,24 @@
#pragma once
#include <XCEngine/Rendering/Planning/CameraRenderRequest.h>
#include <XCEngine/Rendering/Planning/FinalColorSettings.h>
#include <memory>
#include <vector>
namespace XCEngine {
namespace Components {
class CameraComponent;
class Scene;
} // namespace Components
namespace Rendering {
struct CameraRenderRequest;
struct CameraFramePlan;
struct DirectionalShadowPlanningSettings;
class RenderPipeline;
class RenderSurface;
struct RenderContext;
void ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
CameraRenderRequest& request,
@@ -35,6 +39,12 @@ public:
virtual std::unique_ptr<RenderPipeline> CreatePipeline() const = 0;
virtual void ConfigurePipeline(RenderPipeline&) const {}
virtual std::vector<CameraRenderRequest> BuildSceneRenderRequests(
const Components::Scene& scene,
Components::CameraComponent* overrideCamera,
const RenderContext& context,
const RenderSurface& surface,
const DirectionalShadowPlanningSettings& directionalShadowSettings) const;
virtual void ConfigureCameraRenderRequest(
CameraRenderRequest& request,
size_t renderedBaseCameraCount,