Files
XCEngine/docs/api/XCEngine/Rendering/Planning/CameraRenderRequest/CameraRenderRequest.md

139 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CameraRenderRequest
**命名空间**: `XCEngine::Rendering`
**类型**: `struct + related enums + related structs`
**头文件**: `XCEngine/Rendering/Planning/CameraRenderRequest.h`
**描述**: 单相机渲染提交的显式数据契约统一描述主场景、阴影、depth-only、fullscreen、object-id 和 editor 注入阶段。
## 概览
`CameraRenderRequest` 处在 [Planning](../Planning.md) 和 [Execution](../../Execution/Execution.md) 之间。
它不直接渲染任何内容,而是把“这一台相机这一帧该怎样执行”压平成一份可验证、可排序、可扩展的 request。
当前头文件里与它一同公开的核心类型包括:
- `CameraFrameStage`
- `CameraFrameStageInfo`
- `ScenePassRenderRequest`
- `DirectionalShadowRenderPlan`
- `ObjectIdRenderRequest`
- `FullscreenPassRenderRequest`
- `CameraRenderRequest`
这套设计的价值在于:规划层只需要把 request 组装完整,执行层就能按统一阶段顺序跑完一台相机,而不必让 editor、runtime、离屏渲染各自维护一套隐式约定。
## 关键字段
| 字段 | 角色 |
|------|------|
| `scene` / `camera` / `context` | 主场景提取与执行的最小上下文。 |
| `surface` | 当前相机最终主输出目标。 |
| `depthOnly` | depth-only scene pass 子请求。 |
| `shadowCaster` | 显式 shadow-caster scene pass 子请求。 |
| `directionalShadow` | 仅声明方向光阴影计划;必要时由 `CameraRenderer` 自动生成内部 shadow surface。 |
| `postProcess` | fullscreen 后处理阶段请求。 |
| `finalOutput` | fullscreen 最终输出阶段请求。 |
| `finalColorPolicy` | fullscreen 最终颜色策略的解析结果。 |
| `objectId` | object-id 辅助输出请求。 |
| `cameraDepth` / `cameraStackOrder` | 多相机稳定排序键。 |
| `clearFlags` / `clearColorOverride` | 本次提交覆盖写回 `RenderSceneData::cameraData` 的清屏语义。 |
| `preScenePasses` / `postScenePasses` / `overlayPasses` | 调用方注入的附加阶段序列。 |
## 当前阶段顺序
`CameraRenderer` 会按 `kOrderedCameraFrameStages` 解释这份 request
1. `PreScenePasses`
2. `ShadowCaster`
3. `DepthOnly`
4. `MainScene`
5. `PostProcess`
6. `FinalOutput`
7. `ObjectId`
8. `PostScenePasses`
9. `OverlayPasses`
这意味着 fullscreen 阶段和 object-id 不再是调用方各自拼出来的旁路,而是 request 模型里的正式阶段。
## 子请求模型
### `ScenePassRenderRequest`
`depthOnly``shadowCaster` 当前都只是 `ScenePassRenderRequest` 的别名。
它描述“在主 `RenderPipeline` 前,是否要额外执行一次 scene pass”。
- [IsRequested](ScenePassRenderRequest/IsRequested.md) 只判断是否真的挂了目标附件。
- [IsValid](ScenePassRenderRequest/IsValid.md) 进一步要求深度附件、颜色附件和 render area 全部可用。
- `hasCameraDataOverride` / `cameraDataOverride` 允许这条 scene pass 使用不同于主相机的数据;当前方向光阴影路径会利用这一点。
### `DirectionalShadowRenderPlan`
`shadowCaster.surface` 没有显式提供,但 `directionalShadow.IsValid()` 为真时,`CameraRenderer` 会借助 `DirectionalShadowSurfaceCache` 自动构建内部阴影 surface并把 plan 里的 `cameraData` 写回 shadow-caster 子请求。
### `FullscreenPassRenderRequest`
`postProcess``finalOutput` 都是 `FullscreenPassRenderRequest` 的别名。
它们描述:
- 从哪张 source surface 读取
- 用哪张 `sourceColorView` 作为输入
- 把结果写到哪张 destination surface
- 由哪条 `RenderPassSequence` 执行
`SceneRenderer::BuildRenderRequests(...)` 会根据相机后处理描述和 final-color policy 自动补齐这两段 request。
### `ObjectIdRenderRequest`
`objectId` 描述独立的 object-id 辅助输出目标。
当前执行层要求它至少具备:
- 第一张颜色附件
- 深度附件
- 有效 render area
object-id 阶段发生在 `FinalOutput` 之后、`PostScenePasses` 之前。
## 辅助查询函数
头文件还提供了一组阶段化查询 helper
- `HasFrameStage(...)`
- `GetPassSequence(...)`
- `GetScenePassRequest(...)`
- `GetObjectIdRequest(...)`
- `GetMainSceneSurface()`
- `GetFinalCompositedSurface()`
- `GetOutputSurface(...)`
- `GetSourceSurface(...)`
- `GetSourceColorView(...)`
- `GetSourceColorState(...)`
- `RequiresIntermediateSceneColor()`
这些 helper 的意义是把“不同阶段该读哪张 surface、写哪张 surface、是否需要中间颜色缓存”统一收口到 request 模型本身,而不是散落在调用方里。
## 当前数据契约
- [IsValid](IsValid.md) 只检查 `scene``camera``context`,不会替执行层验证所有子请求。
- `CameraRenderer::Render()` 还会继续拒绝无效的 `depthOnly``postProcess``finalOutput``objectId`,以及无法解析的 shadow-caster 请求。
- `SceneRenderer::Render(const std::vector<CameraRenderRequest>&)` 会先按 `cameraStackOrder -> cameraDepth` 稳定排序,再逐条提交。
## 真实使用位置
- [SceneRenderRequestPlanner](../SceneRenderRequestPlanner/SceneRenderRequestPlanner.md) 负责先构建基础 request。
- [SceneRenderer](../../Execution/SceneRenderer/SceneRenderer.md) 负责补 `finalColorPolicy``postProcess``finalOutput`
- editor Scene View 通过 `SceneViewportRenderPlan``ViewportHostRenderFlowUtils` 再补 `objectId``postScenePasses``overlayPasses` 与 clear override。
- [CameraRenderer](../../Execution/CameraRenderer/CameraRenderer.md) 最终按阶段执行整份 request。
## 相关文档
- [IsValid](IsValid.md)
- [ScenePassRenderRequest](ScenePassRenderRequest/ScenePassRenderRequest.md)
- [ObjectIdRenderRequest](ObjectIdRenderRequest/ObjectIdRenderRequest.md)
- [SceneRenderRequestPlanner](../SceneRenderRequestPlanner/SceneRenderRequestPlanner.md)
- [SceneRenderRequestUtils](../SceneRenderRequestUtils/SceneRenderRequestUtils.md)
- [SceneRenderer](../../Execution/SceneRenderer/SceneRenderer.md)
- [CameraRenderer](../../Execution/CameraRenderer/CameraRenderer.md)