docs: update API docs for rendering and script editors
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
# BuiltinObjectIdPass
|
||||
|
||||
**命名空间**: `XCEngine::Rendering::Passes`
|
||||
|
||||
**类型**: `class`
|
||||
|
||||
**头文件**: `XCEngine/Rendering/Passes/BuiltinObjectIdPass.h`
|
||||
|
||||
**描述**: `ObjectIdPass` 的当前内建实现,把可见物体渲染到 object-id 颜色目标,供拾取和后续选择描边使用。
|
||||
|
||||
## 概述
|
||||
|
||||
`BuiltinObjectIdPass` 可以理解成主场景渲染旁边的一条辅助输出路径:
|
||||
|
||||
- 主颜色目标仍由当前 `RenderPipeline` 负责。
|
||||
- object-id 目标由这条 pass 用单独 shader 再画一遍可见物体。
|
||||
- 每个物体的 `GameObject::GetID()` 会被编码成 RGBA 颜色写入目标纹理。
|
||||
|
||||
这样后续只要采样这张 object-id 纹理,就能做选中描边、拾取或调试显示,而不必回读主颜色缓冲。
|
||||
|
||||
## 当前实现流程
|
||||
|
||||
1. 校验 `RenderContext`、颜色附件、深度附件和 `RenderSurface` 的 render area。
|
||||
2. 惰性创建 pipeline layout、pipeline state 和 builtin object-id shader。
|
||||
3. 如果 `RenderSurface` 开启自动状态切换,先把颜色附件切到 `RenderTarget`。
|
||||
4. 清空 object-id 颜色目标为全零。
|
||||
5. 遍历 `RenderSceneData::visibleItems`,按物体 ID 建立或复用常量缓冲并发出 draw call。
|
||||
6. 若开启自动状态切换,再把颜色附件切回 `surface.GetColorStateAfter()`。
|
||||
|
||||
## 关键实现细节
|
||||
|
||||
- 当前 input layout 只声明了 `POSITION`,依赖 mesh 顶点位置即可完成 object-id 绘制。
|
||||
- 每个 object ID 会缓存一套独立 descriptor set,避免重复分配常量绑定。
|
||||
- `RenderResourceCache` 负责把 `Mesh` 上传或复用成 GPU 资源。
|
||||
- shader pass 解析优先匹配 builtin object-id pass tag,其次回退到 `ObjectId` / `EditorObjectId` 命名,最后才退到首个 pass。
|
||||
|
||||
## 当前实现边界
|
||||
|
||||
- 这条 pass 依赖调用方先准备好 `RenderSceneData`,自己不做 scene extraction。
|
||||
- 只处理第一个颜色附件和一个深度附件。
|
||||
- 当前 object-id 绘制仍是逐物体提交,没有更高级的 batching。
|
||||
- 是否支持某个后端,取决于 builtin object-id shader 是否提供对应 graphics variant;现有 shader loader 测试覆盖了 D3D12、OpenGL 和 Vulkan 三种 builtin variant。
|
||||
|
||||
## 真实使用位置
|
||||
|
||||
- `CameraRenderer::Render()` 在主场景渲染后、builtin post-process 前调用 `m_objectIdPass->Render(...)`。
|
||||
- `tests/Editor/test_viewport_render_flow_utils.cpp` 验证了 scene viewport 会为 `CameraRenderRequest::objectId` 正确挂接颜色/深度附件和 shader view。
|
||||
- `tests/Resources/Shader/test_shader_loader.cpp` 验证了 builtin object-id shader 的 pass tag 和多后端 variant 是否存在。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Passes](../Passes.md)
|
||||
- [BuiltinObjectIdOutlinePass](../BuiltinObjectIdOutlinePass/BuiltinObjectIdOutlinePass.md)
|
||||
- [CameraRenderer](../../CameraRenderer/CameraRenderer.md)
|
||||
Reference in New Issue
Block a user