67 lines
2.4 KiB
Markdown
67 lines
2.4 KiB
Markdown
# CameraRenderer::Render
|
||
|
||
**命名空间**: `XCEngine::Rendering`
|
||
|
||
**类型**: `method`
|
||
|
||
**头文件**: `XCEngine/Rendering/Execution/CameraRenderer.h`
|
||
|
||
## 签名
|
||
|
||
```cpp
|
||
bool Render(const CameraRenderRequest& request);
|
||
```
|
||
|
||
## 行为说明
|
||
|
||
执行一次完整的单相机 request。
|
||
|
||
## 当前验证规则
|
||
|
||
进入真正执行前,当前实现会拒绝以下情况:
|
||
|
||
- `!request.IsValid()`
|
||
- `m_pipeline == nullptr`
|
||
- `request.GetMainSceneSurface()` 的 render area 宽或高为 `0`
|
||
- `depthOnly` 被请求但 `depthOnly.IsValid()` 为假
|
||
- `postProcess` 被请求但 `postProcess.IsValid()` 为假
|
||
- `finalOutput` 被请求但 `finalOutput.IsValid()` 为假
|
||
- `objectId` 被请求但 `objectId.IsValid()` 为假
|
||
- `shadowCaster` 显式被请求但无效,或 `directionalShadow` 无法成功解析出内部阴影 surface
|
||
|
||
## 当前执行流程
|
||
|
||
1. 通过 `ResolveShadowCasterRequest(...)` 解析真实的 shadow-caster 输入
|
||
2. 用 `request.GetMainSceneSurface()` 的 render area 调用 `m_sceneExtractor.ExtractForCamera(...)`
|
||
3. 回写 `sceneData.cameraData.clearFlags`
|
||
4. 按需写入 clear-color override
|
||
5. 如果 `request.directionalShadow.IsValid()`,把阴影数据写入 `sceneData.lighting.mainDirectionalShadow`
|
||
6. 根据相机 skybox 配置构建 `sceneData.environment`
|
||
7. 按 `kOrderedCameraFrameStages` 顺序依次执行各阶段
|
||
|
||
## fullscreen 阶段语义
|
||
|
||
`PostProcess` 和 `FinalOutput` 都通过 `RenderPassSequence` 执行:
|
||
|
||
- 当 sequence 只有一个 pass 时,直接读源 surface、写目标 surface
|
||
- 当 sequence 有多个 pass 时,会复用 `FullscreenPassSurfaceCache` 提供的中间 surface
|
||
- `PostProcess` 与 `FinalOutput` 各自持有独立的中间 cache,避免状态串扰
|
||
|
||
## 设计说明
|
||
|
||
把 object-id、fullscreen、overlay 都放进这条执行链,意味着“单相机一帧的完整输出”在这里有唯一真相。
|
||
这比让不同模块各自绕开主管线单独提交一遍更稳定,也更容易做测试。
|
||
|
||
## 返回值
|
||
|
||
- 整条 request 成功执行时返回 `true`
|
||
- 任一验证、提取或阶段执行失败时返回 `false`
|
||
|
||
## 相关文档
|
||
|
||
- [CameraRenderer](CameraRenderer.md)
|
||
- [CameraRenderRequest](../../Planning/CameraRenderRequest/CameraRenderRequest.md)
|
||
- [SceneRenderer](../SceneRenderer/SceneRenderer.md)
|
||
- [RenderSceneExtractor](../../Extraction/RenderSceneExtractor/RenderSceneExtractor.md)
|
||
- [RenderPipeline::Render](../../RenderPipeline/Render.md)
|