5.8 KiB
5.8 KiB
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这类包装逻辑决定,并最终通过 CameraRenderer 的postScenePasses提交
因此它更接近一个“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 的实现,流程是:
- 校验
renderContext、inputs.objectIdTextureView、selectedObjectIds和目标surface - 通过
EnsureInitialized(renderContext, surface)懒创建或重建 pipeline layout、pipeline state 和两个 descriptor set - 把运行时对象 ID 转成 render object id,并最多写入
kMaxSelectedObjectCount = 256项编码颜色 - 把常量缓冲写到
m_constantSet,把inputs.objectIdTextureView写到m_textureSet - 若
surface开启自动状态切换,则把输出颜色附件和 object-id 纹理切到本 pass 需要的状态,并在结束后恢复 - 以
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()为false时,pass 不会替调用方检查或修正目标与输入纹理的资源状态 - 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