4.2 KiB
4.2 KiB
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 决定,并最终通过 CameraRenderer 的postScenePasses提交。
因此它更接近一个“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 的当前实现,流程是:
- 校验上下文、后端、object-id SRV 和选中对象列表。
- 懒初始化内部资源,必要时重新创建 pipeline layout、pipeline state 和两个 descriptor set。
- 从
surface.GetWidth()/GetHeight()计算视口尺寸与 texel size。 - 用
EncodeObjectIdToColor()把选中对象 ID 编码进常量缓冲,最多写入kMaxSelectedObjectCount = 256项。 - 绑定一个 CBV set 和一个 SRV set,设置目标为
surface的第一个颜色附件。 - 以全屏三角形方式执行
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.cpp用SceneViewportSelectionOutlinePassRenderer包装它。- SceneViewportRenderPlan 决定当前帧是否要创建 selection outline pass。
- CameraRenderer 在主场景与 object-id pass 之后执行这些
postScenePasses。 editor/src/Viewport/ViewportHostRenderFlowUtils.h当前为 Scene View 组装默认橙色、2px的 outline style。