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

5.8 KiB
Raw Blame History

BuiltinObjectIdOutlinePass

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

类型: class

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

描述: 内建的全屏轮廓合成 pass读取 object-id 纹理并把选中对象轮廓或调试 selection mask 叠加到当前颜色目标;真正使用哪份 shader 由调用方通过 shaderPath 注入。

概览

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

  • object-id 纹理通常来自 BuiltinObjectIdPass
  • 选中对象列表和样式通常由 editor 侧 Scene View render plan 提供
  • 调用时机通常由 SceneViewportSelectionOutlinePass 这类包装逻辑决定,并最终通过 CameraRendererpostScenePasses 提交

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

和早期实现不同,当前类不再把 outline shader 写死成某个单一后端资源,也不再直接接受裸 objectIdTextureView 参数。源码里的职责边界已经变成:

  • BuiltinObjectIdOutlinePass 只负责资源创建、选中对象编码、object-id 采样和一次全屏三角形执行
  • ObjectIdOutlinePassInputs 描述 object-id 纹理视图及其进入 pass 前的资源状态
  • editor / 调用方 通过 SetShaderPath 或构造函数参数注入具体 shader 路径,并负责准备选中对象列表

输入与输出契约

输入 / 输出 当前要求
renderContext 必须有效。
surface 必须具备恰好一个有效颜色附件,且 render area 有效pass 只写 colorAttachments[0]
inputs ObjectIdOutlinePassInputs 描述;objectIdTextureView 不能为空。
selectedObjectIds 运行时对象 ID 列表;最多编码前 256 个,且至少要有一个能成功转换成 render object id。
style 决定轮廓颜色、宽度和是否改为输出 debug mask。
输出 在主颜色目标上合成轮廓,或在 debug 模式下输出 selection mask 可视化结果。

当前渲染流程

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

  1. 校验 renderContextinputs.objectIdTextureViewselectedObjectIds 和目标 surface
  2. 通过 EnsureInitialized(renderContext, surface) 懒创建或重建 pipeline layout、pipeline state 和两个 descriptor set
  3. 把运行时对象 ID 转成 render object id并最多写入 kMaxSelectedObjectCount = 256 项编码颜色
  4. 把常量缓冲写到 m_constantSet,把 inputs.objectIdTextureView 写到 m_textureSet
  5. surface 开启自动状态切换,则把输出颜色附件和 object-id 纹理切到本 pass 需要的状态,并在结束后恢复
  6. surface.GetRenderArea() 作为 viewport/scissor执行一次全屏三角形 Draw(3, 1, 0, 0)

生命周期

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

当前实现边界

  • 当前不再硬编码限定 D3D12;只要配置 shader 在当前 backend 上存在兼容 graphics variant即可建立资源并执行
  • 在第一次创建资源前必须先提供有效 shaderPath
  • 只处理单颜色附件输出,不写深度
  • surface.IsAutoTransitionEnabled()falsepass 不会替调用方检查或修正目标与输入纹理的资源状态
  • pipeline 资源会按 backend、render target format 和 sample count 重新建立;当前未把 sample quality 纳入该类自身的缓存键

公开方法

方法 说明
Constructor 创建一个 outline pass 对象,并可选地预置 shader 路径。
Destructor 默认析构;不会自动释放内部 RHI 资源。
SetShaderPath 更新当前要加载的 shader 路径,并清空已创建资源。
GetShaderPath 返回当前记录的 shader 路径。
Shutdown 销毁已创建的 pipeline、descriptor 和 shader handle。
Render 读取 object-id 输入,并把轮廓或 debug mask 写入颜色目标。

真实使用位置

  • editor/src/Viewport/Passes/SceneViewportSelectionOutlinePass.cpp 当前会包装它,并通过 GetSceneViewportObjectIdOutlineShaderPath() 注入 editor-owned shader 路径
  • SceneViewportRenderPlan 决定当前帧是否创建 object-id outline 链路
  • CameraRenderer 在主场景与 object-id pass 之后执行这些 postScenePasses

相关文档