docs(rendering): refine selection and object id pass docs

This commit is contained in:
2026-04-10 18:36:17 +08:00
parent 2f3a28ec3e
commit e6ac43b454
4 changed files with 41 additions and 28 deletions

View File

@@ -12,20 +12,20 @@
`BuiltinObjectIdPass` 可以理解成主场景渲染旁边的一条辅助输出路径: `BuiltinObjectIdPass` 可以理解成主场景渲染旁边的一条辅助输出路径:
- 主颜色目标仍由当前 `RenderPipeline` 负责 - 主颜色目标仍由当前 `RenderPipeline` 负责
- object-id 目标由这条 pass 用单独 shader 再画一遍可见物体 - object-id 目标由这条 pass 用单独 shader 再画一遍可见物体
- 每个物体的 `GameObject::GetID()` 会被编码成 RGBA 颜色写入目标纹理 - 每个物体的 `GameObject::GetID()` 会被编码成 RGBA 颜色写入目标纹理
这样后续只要采样这张 object-id 纹理,就能做选中描边、拾取或调试显示,而不必回读主颜色缓冲。 这样后续只要采样这张 object-id 纹理,就能做选中描边、拾取或调试显示,而不必回读主颜色缓冲。
## 当前实现流程 ## 当前实现流程
1. 校验 `RenderContext`、颜色附件、深度附件和 `RenderSurface` 的 render area。 1. 校验 `RenderContext`颜色附件、深度附件和 `RenderSurface` 的 render area。
2. 惰性创建 pipeline layout、pipeline state builtin object-id shader。 2. 按当前 backend、surface 格式和采样描述惰性创建或重建 pipeline layout、pipeline state builtin object-id shader。
3. 如果 `RenderSurface` 开启自动状态切换,先把颜色附件切到 `RenderTarget` 3. 如果 `RenderSurface` 开启自动状态切换,先把颜色附件切到 `RenderTarget`,把深度附件切到 `DepthWrite`
4. 清空 object-id 颜色目标为全零 4. 清空当前 render area 范围内的 object-id 颜色目标和深度目标
5. 遍历 `RenderSceneData::visibleItems`,按物体 ID 建立或复用常量缓冲并发出 draw call。 5. 遍历 `RenderSceneData::visibleItems`,按物体 ID 建立或复用常量缓冲并发出 draw call。
6. 若开启自动状态切换,再把颜色附件切回 `surface.GetColorStateAfter()` 6. 若开启自动状态切换,再把颜色附件和深度附件恢复到 `surface` 记录的 after 状态
## 关键实现细节 ## 关键实现细节

View File

@@ -11,18 +11,19 @@ bool Render(
当前实现会: 当前实现会:
1. 校验 `context`、颜色附件、深度附件和 `surface.GetRenderArea()` 1. 校验 `context`颜色附件、深度附件和 `surface.GetRenderArea()`
2. 调用惰性初始化,必要时建 shader、pipeline layout 和 pipeline state。 2. 调用惰性初始化,必要时按当前 backend、surface 格式与采样描述创建或重建 shader、pipeline layout 和 pipeline state。
3. 如果 `surface` 开启自动状态切换,把第一个颜色附件切到 `RenderTarget` 3. 如果 `surface` 开启自动状态切换,把第一个颜色附件切到 `RenderTarget`,同时把深度附件切到 `DepthWrite`
4. 把当前 render area 清成全零 object-id 颜色。 4. 把当前 render area 清成全零 object-id 颜色,并把深度清到默认值
5. 遍历 `sceneData.visibleItems`,为每个 `gameObject` 编码 object-id 并发出 draw call。 5. 遍历 `sceneData.visibleItems`,为每个 `gameObject` 编码 object-id 并发出 draw call。
6. 如果开启自动状态切换,再把颜色附件切回 `surface.GetColorStateAfter()` 6. 如果开启自动状态切换,再把颜色附件切回 `surface.GetColorStateAfter()`,把深度附件切回 `surface.GetDepthStateAfter()`
## 当前细节 ## 当前细节
- viewport 与 scissor 使用 `surface.GetRenderArea()`,不是整张 surface。 - viewport 与 scissor 使用 `surface.GetRenderArea()`,不是整张 surface。
- 每个 object ID 会缓存一套独立常量 descriptor set。 - 每个 object ID 会缓存一套独立常量 descriptor set。
- section mesh 会按 `VisibleRenderItem::sectionIndex` 绘制对应 section否则退回整 mesh。 - section mesh 会按 `VisibleRenderItem::sectionIndex` 绘制对应 section否则退回整 mesh。
- 当前自动状态切换会同时消费 `RenderSurface` 的颜色和深度 before/after 状态。
## 返回值 ## 返回值

View File

@@ -17,14 +17,16 @@
它不是 `RenderPass` 子类,而是一个自管理资源的独立 helper。 它不是 `RenderPass` 子类,而是一个自管理资源的独立 helper。
当前接口已经把输入纹理打包为 [SelectionOutlinePassInputs](../SelectionOutlinePassInputs/SelectionOutlinePassInputs.md),并允许调用方显式声明 selection mask 与 depth 在进入本 pass 前的资源状态。
## 当前执行流程 ## 当前执行流程
1. [Render](Render.md) 校验 render context、mask view、depth view 和 surface 1. [Render](Render.md) 校验 render context、输入纹理、单颜色目标和有效 render area
2. `EnsureInitialized(...)` 按后端、render target 格式和采样数准备 pipeline 资源 2. `EnsureInitialized(...)` 按后端、render target 格式和采样数准备 pipeline 资源
3. 写入 outline 常量 3. 写入 outline 常量
4. 更新 selection mask / depth 的 SRV 绑定 4. 更新 selection mask / depth 的 SRV 绑定
5. 视情况做资源状态切换 5. 若目标 `surface` 开启自动状态切换,则按 `SelectionOutlinePassInputs` 提供的状态把输入切到 `PixelShaderResource`,并在结束后恢复
6. 绘制一次全屏三角形并恢复资源状态 6. 绘制一次全屏三角形并结束 render pass
## 关键资源 ## 关键资源
@@ -34,6 +36,7 @@
| `m_constantPool` / `m_constantSet` | outline 常量缓冲 | | `m_constantPool` / `m_constantSet` | outline 常量缓冲 |
| `m_texturePool` / `m_textureSet` | selection mask 与 depth SRV | | `m_texturePool` / `m_textureSet` | selection mask 与 depth SRV |
| `m_shaderPath` | 当前使用的 selection-outline shader 路径 | | `m_shaderPath` | 当前使用的 selection-outline shader 路径 |
| `m_renderTargetFormat` / `m_renderTargetSampleCount` | 当前缓存资源所对应的目标格式与采样数 |
## 当前实现边界 ## 当前实现边界
@@ -41,16 +44,18 @@
- 当前不写深度 - 当前不写深度
- 输出样式由 [SelectionOutlineStyle](../SelectionOutlineStyle/SelectionOutlineStyle.md) 控制 - 输出样式由 [SelectionOutlineStyle](../SelectionOutlineStyle/SelectionOutlineStyle.md) 控制
- 输入纹理来源由 [SelectionOutlinePassInputs](../SelectionOutlinePassInputs/SelectionOutlinePassInputs.md) 描述 - 输入纹理来源由 [SelectionOutlinePassInputs](../SelectionOutlinePassInputs/SelectionOutlinePassInputs.md) 描述
-`surface.IsAutoTransitionEnabled()``false` 时,调用方需要自己保证目标与输入纹理已经处于正确状态
- 当前不再硬编码限制为 `D3D12`;只要配置 shader 在当前 backend 上存在兼容 graphics variant即可创建资源并执行
## 公开方法 ## 公开方法
| 方法 | 说明 | | 方法 | 说明 |
|------|------| |------|------|
| [Constructor](Constructor.md) | 创建 pass可注入 shader 路径 | | [Constructor](Constructor.md) | 创建 pass可注入 shader 路径 |
| [SetShaderPath](SetShaderPath.md) | 更新 shader 路径并清空已创建资源 | | [SetShaderPath](SetShaderPath.md) | 更新 shader 路径并清空已创建资源 |
| [GetShaderPath](GetShaderPath.md) | 返回当前 shader 路径 | | [GetShaderPath](GetShaderPath.md) | 返回当前 shader 路径 |
| [Render](Render.md) | 执行全屏描边合成 | | [Render](Render.md) | 执行全屏描边合成 |
| [Shutdown](Shutdown.md) | 销毁内部 RHI 资源 | | [Shutdown](Shutdown.md) | 销毁内部 RHI 资源 |
## 相关文档 ## 相关文档

View File

@@ -12,13 +12,20 @@ bool Render(
## 当前实现流程 ## 当前实现流程
1. 校验 render context、mask/depth 纹理与 surface 1. 校验 `renderContext``inputs.selectionMaskTextureView``inputs.depthTextureView`
2. `EnsureInitialized(...)` 2. 要求 `surface` 具备单个有效颜色附件,以及有效的 `renderArea`
3. 构建 `OutlineConstants` 3. 调用 `EnsureInitialized(renderContext, surface)`如果后端、render target format 或 sample count 变化,会重建内部 pipeline 资源。
4. 写入常量并更新两个 SRV 4. 构建 `OutlineConstants`,并把 selection mask / depth 两个 SRV 写入纹理 descriptor set。
5. 自动状态切换开启时,把目标切到 `RenderTarget`、输入切到 `PixelShaderResource` 5. `surface.IsAutoTransitionEnabled()``true`,则把目标切到 `RenderTarget`,同时把两个输入纹理按 `SelectionOutlinePassInputs` 提供的状态切到 `PixelShaderResource`
6. 绑定两个 descriptor set,执行一次 `Draw(3, 1, 0, 0)` 6. 使用 `surface.GetRenderArea()` 设置 viewport / scissor,执行一次 `Draw(3, 1, 0, 0)`
7. 恢复资源状态 7. 结束 render pass并在自动状态切换开启时恢复目标与输入纹理状态
## 关键语义
- 输入结构显式携带了 selection mask 与 depth 纹理的进入状态,因此本 pass 可以在自动状态切换模式下自行恢复它们。
- 当前只写 `surface` 的第一个颜色附件,不写深度。
- 当自动状态切换关闭时,调用方必须自己保证输出目标和两个输入纹理已经处于正确状态。
- 这条路径当前会按目标格式和采样数缓存/重建 pipeline 资源。
## 相关文档 ## 相关文档