Files
XCEngine/docs/api/XCEngine/Rendering/Execution/CameraRenderer/Render.md

67 lines
2.4 KiB
Markdown
Raw Normal View History

# 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)