Files
XCEngine/docs/api/XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass/BuiltinObjectIdOutlinePass.md

4.2 KiB
Raw Blame History

BuiltinObjectIdOutlinePass

命名空间: XCEngine::Rendering::Passes

类型: class

头文件: XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h

描述: 内建的全屏后处理 pass读取 object-id 纹理并把选中对象轮廓或调试 selection mask 合成到当前颜色目标。

概览

BuiltinObjectIdOutlinePass 处在“object-id 已经生成,但主场景也已经画完”的阶段。它本身不负责提取可见物体,也不负责生成 object-id 纹理,而是消费这些上游结果:

  • object-id 纹理通常来自 BuiltinObjectIdPass
  • 选中对象列表和 style 当前通常由 editor 侧的 Scene View render plan 提供。
  • 调用时机当前由 editor/src/Viewport/Passes/SceneViewportSelectionOutlinePass.cpp 这类包装 pass 决定,并最终通过 CameraRendererpostScenePasses 提交。

因此它更接近一个“builtin selection feedback compositor”而不是一个通用 post-process 框架。

输入与输出契约

输入 / 输出 当前要求
renderContext 必须有效,且后端类型必须是 D3D12
surface 至少要有一个有效的颜色附件pass 只写 colorAttachments[0]
objectIdTextureView 不能为空,并且调用方要保证它已经处于可作为 SRV 读取的状态。
selectedObjectIds 不能为空;超过 256 个时只会取前 256 个。
style 决定轮廓颜色、宽度和是否改为输出 debug mask。
输出 在主颜色目标上 alpha 混合轮廓,或在 debug 模式下输出黑白 selection mask。

当前渲染算法

BuiltinObjectIdOutlinePass.cpp 与 builtin shader 的当前实现,流程是:

  1. 校验上下文、后端、object-id SRV 和选中对象列表。
  2. 懒初始化内部资源,必要时重新创建 pipeline layout、pipeline state 和两个 descriptor set。
  3. surface.GetWidth() / GetHeight() 计算视口尺寸与 texel size。
  4. EncodeObjectIdToColor() 把选中对象 ID 编码进常量缓冲,最多写入 kMaxSelectedObjectCount = 256 项。
  5. 绑定一个 CBV set 和一个 SRV set设置目标为 surface 的第一个颜色附件。
  6. 以全屏三角形方式执行 Draw(3, 1, 0, 0)

生命周期

  • Constructor 只做状态清零,不会立刻创建 GPU 资源。
  • 第一次 Render 成功进入初始化路径时,才会真正创建 descriptor 和 PSO。
  • Shutdown 会显式销毁所有内部缓存对象。
  • Destructor 当前是默认析构,因此如果把它作为长期 renderer 成员使用,调用方仍需在销毁前显式执行 Shutdown()

当前实现边界

  • 只接受 D3D12,其它后端直接返回 false
  • 不处理资源状态切换,也不负责清屏;这些由调用方保证。
  • 当前完全忽略 surface.GetRenderArea()viewport 和 scissor 都直接取整张 surface 的宽高。
  • 只使用第一个颜色附件;多 render target 场景不会同步写其它附件。

公开方法

方法 说明
Constructor 创建一个空的 outline pass 对象。
Destructor 默认析构;不会自动释放内部 RHI 资源。
Shutdown 销毁已创建的 pipeline、descriptor 和 shader handle。
Render 读取 object-id SRV并把轮廓或 debug mask 写入颜色目标。

真实使用位置

  • editor/src/Viewport/Passes/SceneViewportSelectionOutlinePass.cppSceneViewportSelectionOutlinePassRenderer 包装它。
  • SceneViewportRenderPlan 决定当前帧是否要创建 selection outline pass。
  • CameraRenderer 在主场景与 object-id pass 之后执行这些 postScenePasses
  • editor/src/Viewport/ViewportHostRenderFlowUtils.h 当前为 Scene View 组装默认橙色、2px 的 outline style。

相关文档