4.1 KiB
4.1 KiB
BuiltinObjectIdPass
命名空间: XCEngine::Rendering::Passes
类型: class
头文件: XCEngine/Rendering/Passes/BuiltinObjectIdPass.h
描述: ObjectIdPass 的当前内建实现,把可见物体渲染到 object-id 颜色目标,供拾取和后续选择描边使用。
概述
BuiltinObjectIdPass 可以理解成主场景渲染旁边的一条辅助输出路径:
- 主颜色目标仍由当前
RenderPipeline负责 - object-id 目标由这条 pass 用单独 shader 再画一遍可见物体
- 每个物体的
GameObject::GetID()会被编码成 RGBA 颜色写入目标纹理
这样后续只要采样这张 object-id 纹理,就能做选中描边、拾取或调试显示,而不必回读主颜色缓冲。
当前实现流程
- 校验
RenderContext、单颜色附件、深度附件和RenderSurface的 render area。 - 按当前 backend、surface 格式和采样描述惰性创建或重建 pipeline layout、pipeline state 与 builtin object-id shader。
- 如果
RenderSurface开启自动状态切换,则先把颜色附件切到RenderTarget,把深度附件切到DepthWrite。 - 清空当前 render area 范围内的 object-id 颜色目标和深度目标。
- 遍历
RenderSceneData::visibleItems,按物体 ID 建立或复用常量缓冲并发出 draw call。 - 若开启自动状态切换,再把颜色附件和深度附件恢复到
surface记录的 after 状态。
关键实现细节
- 当前 input layout 沿用
Resources::StaticMeshVertex的POSITION / NORMAL / TEXCOORD0三元素布局,而不是单独定义一套 object-id 专用顶点流。 - 每个 object ID 会缓存一套独立 descriptor set,避免重复分配常量绑定。
RenderResourceCache负责把Mesh上传或复用成 GPU 资源。- 当前 object-id shader pass 必须显式声明
resources;如果为空,BuiltinObjectIdPass会直接报错,而不是自动生成 legacy fallback 绑定。 - 显式资源声明随后会统一交给 TryBuildBuiltinPassResourceBindingPlan 解析,并进一步要求最终 plan 只包含唯一的
PerObjectconstant-buffer 绑定。 - shader pass 解析优先匹配 builtin object-id pass tag,其次回退到
ObjectId/EditorObjectId命名,最后才退到首个 pass。
当前实现边界
- 这条 pass 依赖调用方先准备好
RenderSceneData,自己不做 scene extraction。 - 只处理第一个颜色附件和一个深度附件。
- 当前 object-id 绘制仍是逐物体提交,没有更高级的 batching。
- viewport 与 scissor 使用
surface.GetRenderArea(),因此 object-id 输出会跟随当前 request 的子视口。 - 是否支持某个后端,取决于 builtin object-id shader 是否提供对应 graphics variant;现有 shader loader 测试覆盖了 D3D12、OpenGL 和 Vulkan 三种 builtin variant。
公开方法
| 方法 | 说明 |
|---|---|
| Destructor | 析构时关闭内部缓存的 pipeline、descriptor set 和 shader handle。 |
| BuildInputLayout | 生成 object-id pass 当前使用的顶点布局。 |
| Render | 把 visibleItems 再绘制一遍到 object-id 目标。 |
| Shutdown | 主动销毁当前缓存的 GPU 资源。 |
真实使用位置
CameraRenderer::Render()在主场景渲染后、postScenePasses与overlayPasses前调用m_objectIdPass->Render(...)。tests/Editor/test_viewport_render_flow_utils.cpp验证了 scene viewport 会为CameraRenderRequest::objectId正确挂接颜色/深度附件,并在 render plan 侧单独处理 object-id shader view。tests/Resources/Shader/test_shader_loader.cpp验证了 builtin object-id shader 的 pass tag 和多后端 variant 是否存在。