4.8 KiB
CameraRenderRequest
命名空间: XCEngine::Rendering
类型: struct
头文件: XCEngine/Rendering/CameraRenderRequest.h
描述: 把一次单相机提交所需的场景、目标表面、object-id 输出、清屏覆盖和可选 pass 序列打包成显式请求对象。
概览
CameraRenderRequest 是 SceneRenderer 和 CameraRenderer 之间的主要数据契约。它本身不执行渲染,只负责描述“这一台相机这次要怎么提交”:
- 主场景渲染所需的
scene、camera、context和surface - 可选的 object-id 辅助输出
objectId - 多相机排序和清屏覆盖字段
- 主场景前后与最终叠加阶段要执行的可选 pass 序列
Editor Scene View 的网格和选中轮廓,当前由 editor 侧先组装进 postScenePasses / overlayPasses,再随 request 一起交给 CameraRenderer 执行。
核心字段
| 字段 | 角色 |
|---|---|
scene |
本次要提取可见物体的场景。 |
camera |
本次渲染使用的相机组件。 |
context |
当前帧的 RHI 上下文。 |
surface |
主颜色输出目标及其 render area。 |
objectId |
可选的 object-id 辅助输出。 |
cameraDepth |
多相机排序辅助值。 |
cameraStackOrder |
Base / Overlay camera stack 的附加排序键。 |
clearFlags |
回写到 RenderSceneData::cameraData.clearFlags 的覆盖值。 |
hasClearColorOverride / clearColorOverride |
是否覆盖提取出的相机清屏色。 |
preScenePasses |
主管线执行前的可选 RenderPassSequence*。 |
postScenePasses |
主场景和 object-id 之后、overlay 之前执行的可选 RenderPassSequence*。 |
overlayPasses |
最后叠加到主颜色目标上的可选 RenderPassSequence*。 |
objectId
objectId 是一个 ObjectIdRenderRequest,用于描述“是否要额外输出一张 object-id 辅助表面”。
IsRequested()只检查surface是否真的挂了颜色附件。IsValid()进一步要求:- 第一张颜色附件非空
- 深度附件非空
- render area 宽高大于
0
按 engine/src/Rendering/CameraRenderer.cpp 的当前实现,CameraRenderer::Render() 会在主场景主管线之后、postScenePasses 之前执行当前的 ObjectIdPass。
pass 序列字段
preScenePasses、postScenePasses 和 overlayPasses 都是非拥有指针。调用方需要保证这些序列在本次 Render() 完成前保持有效。
preScenePasses适合放主场景之前的准备阶段。postScenePasses适合放主场景和 object-id 之后的附加绘制。overlayPasses适合放最后叠加到主颜色目标上的编辑器覆盖层。
Editor Scene View 当前会先通过 SceneViewportRenderPlan 组装一份 plan,再由 ApplySceneViewportRenderPlan 和 ViewportHostRenderFlowUtils 把:
objectIdpostScenePassesoverlayPasses- clear-color override
写回到这份 request。
当前数据契约
- IsValid 只检查
scene、camera和context,不会验证surface或objectId是否完整。 CameraRenderer::Render()会额外拒绝:surface的 render area 宽高为0objectId.IsRequested()但objectId.IsValid()为假
SceneRenderer::Render(const std::vector<CameraRenderRequest>&)会先检查每条 request 的IsValid(),再按cameraStackOrder和cameraDepth排序后逐条提交。
真实使用位置
SceneRenderer负责构建和排序多个CameraRenderRequest。- Editor Scene View 当前通过 SceneViewportRenderPlan 组装
postScenePasses、overlayPasses与 clear override,并通过 ViewportHostRenderFlowUtils 挂入 object-id surface。 tests/Rendering/unit/test_camera_scene_renderer.cpp明确验证了preScenePasses -> pipeline -> objectId -> postScenePasses的真实执行顺序,以及 request clear override / 排序规则。