docs: expand render request planning docs
This commit is contained in:
@@ -0,0 +1,40 @@
|
|||||||
|
# BuiltinPostProcessRequest
|
||||||
|
|
||||||
|
**命名空间**: `XCEngine::Rendering`
|
||||||
|
|
||||||
|
**类型**: `struct`
|
||||||
|
|
||||||
|
**头文件**: `XCEngine/Rendering/CameraRenderRequest.h`
|
||||||
|
|
||||||
|
**描述**: 描述 scene viewport 一类内建后处理请求,包括无限网格、选中轮廓和调试遮罩所需输入。
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
`BuiltinPostProcessRequest` 是 [CameraRenderRequest](../CameraRenderRequest.md) 里的内建后处理子请求。它不直接决定执行哪些 GPU 步骤,而是把原始输入交给 `BuiltinPostProcessPassSequenceBuilder` 去规划。
|
||||||
|
|
||||||
|
## 字段
|
||||||
|
|
||||||
|
| 字段 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `gridPassData` | 控制是否绘制 scene viewport 的无限网格。 |
|
||||||
|
| `objectIdTextureView` | 供 outline / debug mask 读取的 object-id 纹理 SRV。 |
|
||||||
|
| `selectedObjectIds` | 当前需要描边或调试的对象 ID 集合。 |
|
||||||
|
| `outlineStyle` | 轮廓颜色、宽度和调试遮罩开关。 |
|
||||||
|
|
||||||
|
## 关键语义
|
||||||
|
|
||||||
|
- [IsRequested](IsRequested.md) 当前只看 `gridPassData.valid` 和 `selectedObjectIds`,不会因为单独设置了 `objectIdTextureView` 或 `outlineStyle.debugSelectionMask` 就自动变成“已请求”。
|
||||||
|
- 这意味着 `objectIdTextureView` 更像是 outline / debug 路径的依赖输入,而不是请求开关本身。
|
||||||
|
- 更细的回退策略和步骤顺序由 `BuiltinPostProcessPassSequenceBuilder` 与 `BuiltinPostProcessPassPlan` 决定。
|
||||||
|
|
||||||
|
## 真实使用位置
|
||||||
|
|
||||||
|
- 编辑器 scene viewport 会构造这份请求,把无限网格、选中实体 ID 和 outline style 传进 `CameraRenderer`。
|
||||||
|
- `CameraRenderer::Render()` 在主场景和 `postScenePasses` 之后,调用 builtin post-process builder 处理这里的内容。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [CameraRenderRequest](../CameraRenderRequest.md)
|
||||||
|
- [IsRequested](IsRequested.md)
|
||||||
|
- [Passes](../../Passes/Passes.md)
|
||||||
|
- [BuiltinPostProcessPassSequenceBuilder](../../Passes/BuiltinPostProcessPassSequenceBuilder/BuiltinPostProcessPassSequenceBuilder.md)
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
# BuiltinPostProcessRequest::IsRequested
|
||||||
|
|
||||||
|
检查当前是否请求了 builtin 后处理。
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
bool IsRequested() const;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 行为说明
|
||||||
|
|
||||||
|
当前头文件内联实现只有一条规则:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
return gridPassData.valid || !selectedObjectIds.empty();
|
||||||
|
```
|
||||||
|
|
||||||
|
## 返回值
|
||||||
|
|
||||||
|
- 当 `gridPassData.valid` 为真,或 `selectedObjectIds` 非空时,返回 `true`。
|
||||||
|
- 否则返回 `false`。
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- 单独设置 `objectIdTextureView` 不会让请求生效。
|
||||||
|
- 单独把 `outlineStyle.debugSelectionMask` 设成 `true` 也不会让请求生效;仍然需要 grid 或 selection 至少有一个真正开启。
|
||||||
|
- 这也是为什么 scene viewport 必须显式提供选中对象 ID,outline / debug mask 路径才会进入 builder。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [返回类型总览](BuiltinPostProcessRequest.md)
|
||||||
|
- [CameraRenderRequest](../CameraRenderRequest.md)
|
||||||
|
- [BuiltinPostProcessPassSequenceBuilder](../../Passes/BuiltinPostProcessPassSequenceBuilder/BuiltinPostProcessPassSequenceBuilder.md)
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
### `objectId`
|
### `objectId`
|
||||||
|
|
||||||
`objectId` 是一个 `ObjectIdRenderRequest`,用于描述“是否要额外渲染一张 object-id 辅助纹理”。
|
`objectId` 是一个 [ObjectIdRenderRequest](ObjectIdRenderRequest/ObjectIdRenderRequest.md),用于描述“是否要额外渲染一张 object-id 辅助纹理”。
|
||||||
|
|
||||||
- `IsRequested()` 只检查 `surface` 是否挂了颜色附件。
|
- `IsRequested()` 只检查 `surface` 是否挂了颜色附件。
|
||||||
- `IsValid()` 进一步要求:
|
- `IsValid()` 进一步要求:
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
|
|
||||||
### `builtinPostProcess`
|
### `builtinPostProcess`
|
||||||
|
|
||||||
`builtinPostProcess` 是一个 `BuiltinPostProcessRequest`,用于描述 scene viewport 一类内建附加效果:
|
`builtinPostProcess` 是一个 [BuiltinPostProcessRequest](BuiltinPostProcessRequest/BuiltinPostProcessRequest.md),用于描述 scene viewport 一类内建附加效果:
|
||||||
|
|
||||||
- `gridPassData` 控制无限网格
|
- `gridPassData` 控制无限网格
|
||||||
- `objectIdTextureView` 把 object-id 纹理作为 SRV 传给后处理
|
- `objectIdTextureView` 把 object-id 纹理作为 SRV 传给后处理
|
||||||
@@ -79,6 +79,8 @@
|
|||||||
## 相关文档
|
## 相关文档
|
||||||
|
|
||||||
- [IsValid](IsValid.md)
|
- [IsValid](IsValid.md)
|
||||||
|
- [ObjectIdRenderRequest](ObjectIdRenderRequest/ObjectIdRenderRequest.md)
|
||||||
|
- [BuiltinPostProcessRequest](BuiltinPostProcessRequest/BuiltinPostProcessRequest.md)
|
||||||
- [CameraRenderer](../CameraRenderer/CameraRenderer.md)
|
- [CameraRenderer](../CameraRenderer/CameraRenderer.md)
|
||||||
- [SceneRenderer](../SceneRenderer/SceneRenderer.md)
|
- [SceneRenderer](../SceneRenderer/SceneRenderer.md)
|
||||||
- [RenderContext](../RenderContext/RenderContext.md)
|
- [RenderContext](../RenderContext/RenderContext.md)
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# ObjectIdRenderRequest::IsRequested
|
||||||
|
|
||||||
|
检查当前是否请求了 object-id 辅助输出。
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
bool IsRequested() const;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 行为说明
|
||||||
|
|
||||||
|
当前头文件内联实现只有一条判断:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
return !surface.GetColorAttachments().empty();
|
||||||
|
```
|
||||||
|
|
||||||
|
## 返回值
|
||||||
|
|
||||||
|
- 只要 `surface` 上至少挂了一个颜色附件,就返回 `true`。
|
||||||
|
- 否则返回 `false`。
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- 这不是完整性校验;颜色附件数组非空并不代表第一个附件非空,也不代表深度附件和 render area 合法。
|
||||||
|
- 真正更严格的检查在 [IsValid](IsValid.md)。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [返回类型总览](ObjectIdRenderRequest.md)
|
||||||
|
- [IsValid](IsValid.md)
|
||||||
|
- [CameraRenderRequest](../CameraRenderRequest.md)
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# ObjectIdRenderRequest::IsValid
|
||||||
|
|
||||||
|
检查当前 object-id 输出目标是否满足执行 pass 的最小条件。
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
bool IsValid() const;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 行为说明
|
||||||
|
|
||||||
|
当前头文件内联实现要求同时满足:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
const std::vector<RHI::RHIResourceView*>& colorAttachments = surface.GetColorAttachments();
|
||||||
|
return !colorAttachments.empty() &&
|
||||||
|
colorAttachments[0] != nullptr &&
|
||||||
|
surface.GetDepthAttachment() != nullptr &&
|
||||||
|
surface.GetRenderAreaWidth() > 0 &&
|
||||||
|
surface.GetRenderAreaHeight() > 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 返回值
|
||||||
|
|
||||||
|
- 第一个颜色附件非空、深度附件非空且 render area 宽高都大于 `0` 时返回 `true`。
|
||||||
|
- 否则返回 `false`。
|
||||||
|
|
||||||
|
## 与 `CameraRenderer::Render()` 的关系
|
||||||
|
|
||||||
|
- `CameraRenderer::Render()` 会先看 [IsRequested](IsRequested.md)。
|
||||||
|
- 如果请求了 object-id 输出,但这里返回 `false`,整次相机渲染会直接失败。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [返回类型总览](ObjectIdRenderRequest.md)
|
||||||
|
- [IsRequested](IsRequested.md)
|
||||||
|
- [CameraRenderer::Render](../../CameraRenderer/Render.md)
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# ObjectIdRenderRequest
|
||||||
|
|
||||||
|
**命名空间**: `XCEngine::Rendering`
|
||||||
|
|
||||||
|
**类型**: `struct`
|
||||||
|
|
||||||
|
**头文件**: `XCEngine/Rendering/CameraRenderRequest.h`
|
||||||
|
|
||||||
|
**描述**: 描述一份 camera request 是否需要额外输出 object-id 纹理,以及这份输出目标是否完整可用。
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
`ObjectIdRenderRequest` 是 [CameraRenderRequest](../CameraRenderRequest.md) 里的辅助子请求,用来把“主场景颜色输出”和“object-id 辅助输出”拆开描述。
|
||||||
|
|
||||||
|
它当前只持有一个字段:
|
||||||
|
|
||||||
|
| 字段 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `surface` | object-id pass 要写入的目标表面,通常是单独的颜色附件 + 深度附件组合。 |
|
||||||
|
|
||||||
|
## 关键语义
|
||||||
|
|
||||||
|
- [IsRequested](IsRequested.md) 只回答“调用方有没有挂一个颜色附件过来”。
|
||||||
|
- [IsValid](IsValid.md) 才回答“这份 object-id 输出目标是否足够完整,可以真正执行 pass”。
|
||||||
|
- `CameraRenderer::Render()` 会在主场景之后检查并消费这个子请求。
|
||||||
|
|
||||||
|
## 真实使用位置
|
||||||
|
|
||||||
|
- 编辑器 scene viewport 会准备一张单独的 object-id render target,并把它装进 `request.objectId.surface`。
|
||||||
|
- `CameraRenderer::Render()` 在 `request.objectId.IsRequested()` 为真时,调用当前的 `ObjectIdPass` 执行辅助输出。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [CameraRenderRequest](../CameraRenderRequest.md)
|
||||||
|
- [IsRequested](IsRequested.md)
|
||||||
|
- [IsValid](IsValid.md)
|
||||||
|
- [CameraRenderer](../../CameraRenderer/CameraRenderer.md)
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# SceneRenderRequestPlanner::BuildRequests
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
std::vector<CameraRenderRequest> BuildRequests(
|
||||||
|
const Components::Scene& scene,
|
||||||
|
Components::CameraComponent* overrideCamera,
|
||||||
|
const RenderContext& context,
|
||||||
|
const RenderSurface& surface) const;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 行为说明
|
||||||
|
|
||||||
|
当前实现先调用 [CollectCameras](CollectCameras.md) 取得这次需要处理的相机列表,然后逐个调用 `SceneRenderRequestUtils::BuildCameraRenderRequest(...)` 生成请求。
|
||||||
|
|
||||||
|
构建过程中会维护两类计数:
|
||||||
|
|
||||||
|
- `renderedBaseCameraCount`
|
||||||
|
- 已成功加入结果数组的 request 数量
|
||||||
|
|
||||||
|
这两个计数会传给 `ResolveClearFlags()`,用于推导 `Auto` clear mode 的最终清屏行为。
|
||||||
|
|
||||||
|
## 当前过滤规则
|
||||||
|
|
||||||
|
- 如果某台相机最终生成的 request render area 宽高为 `0`,该请求会被跳过。
|
||||||
|
- 只有真正成功加入结果数组的 base camera,才会推进 `renderedBaseCameraCount`。
|
||||||
|
- 方法不会抛出失败原因;调用方只会拿到最终保留下来的请求数组。
|
||||||
|
|
||||||
|
## 返回值
|
||||||
|
|
||||||
|
- 一组已经完成基础字段填充的 [CameraRenderRequest](../CameraRenderRequest/CameraRenderRequest.md)。
|
||||||
|
- 结果可能为空,例如没有可用相机,或所有相机的 render area 都被裁成了零尺寸。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [SceneRenderRequestPlanner](SceneRenderRequestPlanner.md)
|
||||||
|
- [CollectCameras](CollectCameras.md)
|
||||||
|
- [SceneRenderRequestUtils](../SceneRenderRequestUtils/SceneRenderRequestUtils.md)
|
||||||
|
- [SceneRenderer::BuildRenderRequests](../SceneRenderer/BuildRenderRequests.md)
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# SceneRenderRequestPlanner::CollectCameras
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
std::vector<Components::CameraComponent*> CollectCameras(
|
||||||
|
const Components::Scene& scene,
|
||||||
|
Components::CameraComponent* overrideCamera) const;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 行为说明
|
||||||
|
|
||||||
|
当前实现按下面的顺序决定这次真正参与渲染规划的相机列表:
|
||||||
|
|
||||||
|
1. 如果 `overrideCamera` 通过 [SceneRenderRequestUtils](../SceneRenderRequestUtils/SceneRenderRequestUtils.md) 的 `IsUsableCamera()` 检查,则只返回这一台相机。
|
||||||
|
2. 否则从 `scene` 里收集全部 `CameraComponent`。
|
||||||
|
3. 过滤掉不可用相机。
|
||||||
|
4. 调用 `SceneRenderRequestUtils::SortSceneCamerasForRendering(...)` 做稳定排序。
|
||||||
|
|
||||||
|
## 返回值
|
||||||
|
|
||||||
|
- 一个已经过滤并排序好的相机数组。
|
||||||
|
- 如果没有任何可用相机,返回空数组。
|
||||||
|
|
||||||
|
## 当前排序语义
|
||||||
|
|
||||||
|
- `base` 相机会排在 `overlay` 前面。
|
||||||
|
- 同一 stack 类型内部再按 `depth` 升序。
|
||||||
|
- 排序使用 `std::stable_sort()`,所以完全同键时仍保留场景原始枚举顺序。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [SceneRenderRequestPlanner](SceneRenderRequestPlanner.md)
|
||||||
|
- [BuildRequests](BuildRequests.md)
|
||||||
|
- [SceneRenderRequestUtils](../SceneRenderRequestUtils/SceneRenderRequestUtils.md)
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# SceneRenderRequestPlanner
|
||||||
|
|
||||||
|
**命名空间**: `XCEngine::Rendering`
|
||||||
|
|
||||||
|
**类型**: `class`
|
||||||
|
|
||||||
|
**头文件**: `XCEngine/Rendering/SceneRenderRequestPlanner.h`
|
||||||
|
|
||||||
|
**描述**: 负责从场景和可选 override camera 生成实际要提交给 `CameraRenderer` 的相机请求列表。
|
||||||
|
|
||||||
|
## 概览
|
||||||
|
|
||||||
|
`SceneRenderRequestPlanner` 处在 [SceneRenderer](../SceneRenderer/SceneRenderer.md) 和 [SceneRenderRequestUtils](../SceneRenderRequestUtils/SceneRenderRequestUtils.md) 之间。
|
||||||
|
|
||||||
|
它不亲自渲染任何东西,而是把“应该渲染哪些相机、按什么顺序、哪些请求应该被丢弃”整理成一组 [CameraRenderRequest](../CameraRenderRequest/CameraRenderRequest.md)。
|
||||||
|
|
||||||
|
## 公开方法
|
||||||
|
|
||||||
|
| 方法 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| [CollectCameras](CollectCameras.md) | 收集本次应参与渲染的相机列表。 |
|
||||||
|
| [BuildRequests](BuildRequests.md) | 把相机列表展开成可执行的 `CameraRenderRequest` 数组。 |
|
||||||
|
|
||||||
|
## 当前规划规则
|
||||||
|
|
||||||
|
### `CollectCameras()`
|
||||||
|
|
||||||
|
当前规则是:
|
||||||
|
|
||||||
|
1. 如果 `overrideCamera` 可用,则只渲染它自己。
|
||||||
|
2. 否则从场景里查找全部 `CameraComponent`。
|
||||||
|
3. 过滤掉不可用相机。
|
||||||
|
4. 按 [SceneRenderRequestUtils](../SceneRenderRequestUtils/SceneRenderRequestUtils.md) 里的稳定排序规则整理顺序。
|
||||||
|
|
||||||
|
### `BuildRequests()`
|
||||||
|
|
||||||
|
它会按相机顺序逐个调用 `BuildCameraRenderRequest()`,并维护:
|
||||||
|
|
||||||
|
- `renderedBaseCameraCount`
|
||||||
|
- 已成功生成的 request 数量
|
||||||
|
|
||||||
|
这两个计数会影响自动 clear flag 的推导。
|
||||||
|
|
||||||
|
如果某个相机最终解析出的 render area 宽高为 `0`,该请求会被直接丢弃,而且不会错误地推进 base camera 计数。
|
||||||
|
|
||||||
|
## 真实使用位置
|
||||||
|
|
||||||
|
- `engine/include/XCEngine/Rendering/SceneRenderer.h` 持有一个 `SceneRenderRequestPlanner` 实例。
|
||||||
|
- `engine/src/Rendering/SceneRenderRequestPlanner.cpp` 实现具体收集与构建逻辑。
|
||||||
|
- `tests/Rendering/unit/test_scene_render_request_planner.cpp` 覆盖了 override camera、稳定排序和零尺寸 viewport 的行为。
|
||||||
|
|
||||||
|
## 当前实现边界
|
||||||
|
|
||||||
|
- 它只规划相机请求,不处理 object-id 或 builtin post-process 的具体填充;那部分通常由更上层调用方补充。
|
||||||
|
- 当前没有 camera stacking 的更复杂依赖分析,只有 base / overlay 与 depth 的线性排序。
|
||||||
|
- `BuildRequests()` 只返回成功构建的请求,不单独报告被过滤掉的相机原因。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [当前模块](../Rendering.md)
|
||||||
|
- [CollectCameras](CollectCameras.md)
|
||||||
|
- [BuildRequests](BuildRequests.md)
|
||||||
|
- [SceneRenderer](../SceneRenderer/SceneRenderer.md)
|
||||||
|
- [SceneRenderRequestUtils](../SceneRenderRequestUtils/SceneRenderRequestUtils.md)
|
||||||
|
- [CameraRenderRequest](../CameraRenderRequest/CameraRenderRequest.md)
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
# SceneRenderRequestUtils
|
||||||
|
|
||||||
|
**命名空间**: `XCEngine::Rendering::SceneRenderRequestUtils`
|
||||||
|
|
||||||
|
**类型**: `utility header`
|
||||||
|
|
||||||
|
**头文件**: `XCEngine/Rendering/SceneRenderRequestUtils.h`
|
||||||
|
|
||||||
|
**描述**: 提供相机可用性判断、稳定排序、clear flag 推导、render area 计算和 request 组装等内联 helper。
|
||||||
|
|
||||||
|
## 概览
|
||||||
|
|
||||||
|
`SceneRenderRequestUtils.h` 是当前相机请求规划链路的规则库。
|
||||||
|
|
||||||
|
和 [SceneRenderRequestPlanner](../SceneRenderRequestPlanner/SceneRenderRequestPlanner.md) 的职责分工是:
|
||||||
|
|
||||||
|
- planner 决定“要处理哪些相机”
|
||||||
|
- utils 决定“这些相机和请求该怎样排序、怎样计算 clear、怎样落成具体 request”
|
||||||
|
|
||||||
|
## 公开规则
|
||||||
|
|
||||||
|
### 相机可用性
|
||||||
|
|
||||||
|
`IsUsableCamera()` 只接受:
|
||||||
|
|
||||||
|
- 非空相机
|
||||||
|
- 组件启用
|
||||||
|
- 挂载 `GameObject` 非空
|
||||||
|
- 对象处于 `IsActiveInHierarchy()`
|
||||||
|
|
||||||
|
### 排序
|
||||||
|
|
||||||
|
`SortSceneCamerasForRendering()` 与 `SortCameraRenderRequests()` 都使用 `std::stable_sort()`,因此在排序键完全相同的情况下,会保留原始相对顺序。
|
||||||
|
|
||||||
|
当前排序键分别是:
|
||||||
|
|
||||||
|
- 场景相机: `stackType` -> `depth`
|
||||||
|
- 渲染请求: `cameraStackOrder` -> `cameraDepth`
|
||||||
|
|
||||||
|
### clear flag 推导
|
||||||
|
|
||||||
|
`ResolveClearFlags()` 的规则是:
|
||||||
|
|
||||||
|
- `ColorAndDepth` -> `RenderClearFlags::All`
|
||||||
|
- `DepthOnly` -> `RenderClearFlags::Depth`
|
||||||
|
- `None` -> `RenderClearFlags::None`
|
||||||
|
- `Auto`
|
||||||
|
- overlay camera: 本次若还是首个已渲染 request,则清 `All`,否则只清 `Depth`
|
||||||
|
- base camera: 若还没有任何成功渲染的 base camera,则清 `All`,否则只清 `Depth`
|
||||||
|
|
||||||
|
### render area 计算
|
||||||
|
|
||||||
|
`ResolveCameraRenderArea()` 会把相机 `viewportRect` 解释为父 `RenderSurface` 当前 render area 的归一化子矩形:
|
||||||
|
|
||||||
|
- 左上边界使用 `floor`
|
||||||
|
- 右下边界使用 `ceil`
|
||||||
|
|
||||||
|
### request 组装
|
||||||
|
|
||||||
|
`BuildCameraRenderRequest()` 当前会:
|
||||||
|
|
||||||
|
- 清空输出 request
|
||||||
|
- 绑定 `scene`、`camera`、`context`
|
||||||
|
- 复制输入 `surface`,再把 render area 改成相机子区域
|
||||||
|
- 写入 `cameraDepth`、`cameraStackOrder`、`clearFlags`
|
||||||
|
- 只有 render area 宽高都大于 `0` 时才返回 `true`
|
||||||
|
|
||||||
|
## 测试验证的真实行为
|
||||||
|
|
||||||
|
`tests/Rendering/unit/test_scene_render_request_utils.cpp` 已覆盖:
|
||||||
|
|
||||||
|
- 空指针 / 禁用 / 非激活相机都会被拒绝
|
||||||
|
- 场景相机与 request 排序都保持稳定 tie 顺序
|
||||||
|
- `Auto` clear mode 在 base / overlay 下的回退行为
|
||||||
|
- 嵌套 render area 的矩形组合规则
|
||||||
|
- 零尺寸 viewport 会导致 request 构建失败
|
||||||
|
|
||||||
|
## 当前实现边界
|
||||||
|
|
||||||
|
- 这些 helper 是纯局部规则,不处理多表面、多窗口或跨帧状态。
|
||||||
|
- clear 推导只依赖当前计数,不关心更复杂的 camera stack 依赖关系。
|
||||||
|
- request 组装阶段只填基础字段,object-id 与 builtin post-process 仍需上层补全。
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [当前模块](../Rendering.md)
|
||||||
|
- [SceneRenderRequestPlanner](../SceneRenderRequestPlanner/SceneRenderRequestPlanner.md)
|
||||||
|
- [CameraRenderRequest](../CameraRenderRequest/CameraRenderRequest.md)
|
||||||
|
- [SceneRenderer](../SceneRenderer/SceneRenderer.md)
|
||||||
Reference in New Issue
Block a user