4.9 KiB
4.9 KiB
CameraRenderer
命名空间: XCEngine::Rendering
类型: class
头文件: XCEngine/Rendering/Execution/CameraRenderer.h
描述: 单个 CameraRenderRequest 的执行器,负责把一份显式 request 变成稳定的逐阶段渲染流程。
概览
CameraRenderer 是 Execution 层里最靠近“真正发起一次相机渲染”的类。
它不负责决定应该渲染哪些相机,也不负责 request 排序;这些职责在 Planning 和 SceneRenderer。
它负责的是另一半:把一份已经构造好的 CameraRenderRequest 按当前引擎约定的阶段顺序完整跑完。
当前持有对象
m_sceneExtractor负责把Scene + Camera压成RenderSceneData。m_pipelineAsset当前主管线的创建来源;为空时表示直接持有 runtime pipeline。m_pipeline真正执行主场景绘制的 RenderPipeline。m_objectIdPassobject-id 输出阶段使用的RenderPass。m_depthOnlyPassdepth-only 阶段使用的RenderPass。m_shadowCasterPassshadow-caster 阶段使用的RenderPass。m_directionalShadowSurface当 request 只提供DirectionalShadowRenderPlan、而没有显式shadowCaster.surface时,按需生成阴影贴图 surface。m_postProcessSurfaceCachem_finalOutputSurfaceCachefullscreen 阶段多 pass 链使用的中间 surface cache。
当前执行顺序
CameraRenderer::Render(...) 会按 kOrderedCameraFrameStages 依次执行:
PreScenePassesShadowCasterDepthOnlyMainScenePostProcessFinalOutputObjectIdPostScenePassesOverlayPasses
其中:
MainScene永远会尝试执行。- 其他阶段是否执行,由
CameraRenderRequest::HasFrameStage(...)决定。 ShadowCaster既可以消费显式request.shadowCaster,也可以由request.directionalShadow推导出内部阴影 surface。
设计要点
为什么这里坚持“显式阶段链”
这和 Unity SRP 里常见的 camera render loop 思路相似:每个阶段有稳定顺序,request 只是声明“这一帧这个阶段要不要做”。
这样做的好处是:
- post-process、final-output 和 editor 注入 pass 都能接到同一条链上
- 不同调用方不需要各自复制一套“主场景之后到底先做什么”的隐式约定
- object-id、selection、scene view overlay 这类非主画面输出,不会反向污染主管线实现
为什么 fullscreen 阶段不放到 pipeline 内部
RenderPipeline 关注的是主场景绘制;fullscreen 链更像是 request 级组合层。
把它们留在 CameraRenderer,可以让不同 pipeline 共享一致的 post-process / final-output 接线方式。
当前实现边界
- 这里只执行单个 request,不负责 request 排序。
- 这里只消费 request 上已经挂好的 sequence / sub-request,不负责为 Editor 自动生成这些附加阶段。
RenderPassSequence的生命周期由 request 拥有方管理;当前实现不会在一次Render()结束后主动销毁这些 sequence。
公开方法
| 方法 | 说明 |
|---|---|
| Constructor | 构造执行器,并决定主管线与 builtin pass 的初始来源。 |
| Destructor | 关闭当前主管线与 builtin pass。 |
| SetPipeline | 直接替换 runtime RenderPipeline。 |
| SetPipelineAsset | 通过 RenderPipelineAsset 重建当前主管线。 |
| SetObjectIdPass | 替换 object-id pass。 |
| SetDepthOnlyPass | 替换 depth-only pass。 |
| SetShadowCasterPass | 替换 shadow-caster pass。 |
| GetPipeline | 返回当前主管线的非拥有指针。 |
| GetPipelineAsset | 返回当前 pipeline asset 的非拥有指针。 |
| GetObjectIdPass | 返回当前 object-id pass 的非拥有指针。 |
| GetDepthOnlyPass | 返回当前 depth-only pass 的非拥有指针。 |
| GetShadowCasterPass | 返回当前 shadow-caster pass 的非拥有指针。 |
| Render | 执行一次完整的单相机 request。 |