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

4.8 KiB
Raw Blame History

CameraRenderRequest

命名空间: XCEngine::Rendering

类型: struct

头文件: XCEngine/Rendering/CameraRenderRequest.h

描述: 把一次单相机提交所需的场景、目标表面、object-id 输出、清屏覆盖和可选 pass 序列打包成显式请求对象。

概览

CameraRenderRequestSceneRendererCameraRenderer 之间的主要数据契约。它本身不执行渲染,只负责描述“这一台相机这次要怎么提交”:

  • 主场景渲染所需的 scenecameracontextsurface
  • 可选的 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 序列字段

preScenePassespostScenePassesoverlayPasses 都是非拥有指针。调用方需要保证这些序列在本次 Render() 完成前保持有效。

  • preScenePasses 适合放主场景之前的准备阶段。
  • postScenePasses 适合放主场景和 object-id 之后的附加绘制。
  • overlayPasses 适合放最后叠加到主颜色目标上的编辑器覆盖层。

Editor Scene View 当前会先通过 SceneViewportRenderPlan 组装一份 plan再由 ApplySceneViewportRenderPlanViewportHostRenderFlowUtils 把:

  • objectId
  • postScenePasses
  • overlayPasses
  • clear-color override

写回到这份 request。

当前数据契约

  • IsValid 只检查 scenecameracontext,不会验证 surfaceobjectId 是否完整。
  • CameraRenderer::Render() 会额外拒绝:
    • surface 的 render area 宽高为 0
    • objectId.IsRequested()objectId.IsValid() 为假
  • SceneRenderer::Render(const std::vector<CameraRenderRequest>&) 会先检查每条 request 的 IsValid(),再按 cameraStackOrdercameraDepth 排序后逐条提交。

真实使用位置

  • SceneRenderer 负责构建和排序多个 CameraRenderRequest
  • Editor Scene View 当前通过 SceneViewportRenderPlan 组装 postScenePassesoverlayPasses 与 clear override并通过 ViewportHostRenderFlowUtils 挂入 object-id surface。
  • tests/Rendering/unit/test_camera_scene_renderer.cpp 明确验证了 preScenePasses -> pipeline -> objectId -> postScenePasses 的真实执行顺序,以及 request clear override / 排序规则。

相关文档