docs: sync rendering builtin pass docs

This commit is contained in:
2026-04-04 01:10:38 +08:00
parent d207043f8f
commit 8de68c0fc9
16 changed files with 326 additions and 37 deletions

View File

@@ -6,7 +6,7 @@
**头文件**: `XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h`
**描述**: 内建的全屏后处理 pass读取 object-id 纹理并把选中对象轮廓或调试 selection mask 合成到当前颜色目标。
**描述**: 内建的全屏后处理 pass读取 object-id 纹理并把选中对象轮廓或调试 selection mask 合成到当前颜色目标;真正使用哪份 shader 由调用方通过 `shaderPath` 注入
## 概览
@@ -18,6 +18,16 @@
因此它更接近一个“builtin selection feedback compositor”而不是一个通用 post-process 框架。
和早期实现不同,当前类已经不再把 outline shader 写死为 engine builtin 资源。源码里的职责边界是:
- `BuiltinObjectIdOutlinePass`
只负责资源创建、object-id 采样、常量编码和一次全屏三角形执行。
- editor 调用方
通过 [SetShaderPath](SetShaderPath.md) 或构造函数参数注入具体 shader 路径。
- `SceneViewportSelectionOutlinePass`
当前用 [SceneViewportShaderPaths](../../../Editor/Viewport/SceneViewportShaderPaths/SceneViewportShaderPaths.md)
生成 editor-owned object-id outline shader 路径,再交给这里执行。
## 输入与输出契约
| 输入 / 输出 | 当前要求 |
@@ -31,10 +41,10 @@
## 当前渲染算法
`BuiltinObjectIdOutlinePass.cpp` builtin shader 的当前实现,流程是:
`BuiltinObjectIdOutlinePass.cpp`当前配置 shader 的实现,流程是:
1. 校验上下文、后端、object-id SRV 和选中对象列表。
2. 懒初始化内部资源,必要时重新创建 pipeline layout、pipeline state 和两个 descriptor set。
2. 懒初始化内部资源,必要时重新创建 pipeline layout、pipeline state 和两个 descriptor set;这一步要求 `shaderPath` 非空且可成功加载
3.`surface.GetWidth()` / `GetHeight()` 计算视口尺寸与 texel size。
4.`EncodeObjectIdToColor()` 把选中对象 ID 编码进常量缓冲,最多写入 `kMaxSelectedObjectCount = 256` 项。
5. 绑定一个 CBV set 和一个 SRV set设置目标为 `surface` 的第一个颜色附件。
@@ -43,6 +53,7 @@
## 生命周期
- [Constructor](Constructor.md) 只做状态清零,不会立刻创建 GPU 资源。
- [SetShaderPath](SetShaderPath.md) 更新路径时,会立刻销毁当前缓存的 RHI 资源,等待下一次 `Render()` 重新初始化。
- 第一次 [Render](Render.md) 成功进入初始化路径时,才会真正创建 descriptor 和 PSO。
- [Shutdown](Shutdown.md) 会显式销毁所有内部缓存对象。
- [Destructor](Destructor.md) 当前是默认析构,因此如果把它作为长期 renderer 成员使用,调用方仍需在销毁前显式执行 `Shutdown()`
@@ -50,6 +61,7 @@
## 当前实现边界
- 只接受 `D3D12`,其它后端直接返回 `false`
- 在第一次创建资源前必须先提供有效 `shaderPath`;空路径会记录错误并返回 `false`
- 不处理资源状态切换,也不负责清屏;这些由调用方保证。
- 当前完全忽略 `surface.GetRenderArea()`viewport 和 scissor 都直接取整张 surface 的宽高。
- 只使用第一个颜色附件;多 render target 场景不会同步写其它附件。
@@ -58,14 +70,17 @@
| 方法 | 说明 |
|------|------|
| [Constructor](Constructor.md) | 创建一个空的 outline pass 对象。 |
| [Constructor](Constructor.md) | 创建一个 outline pass 对象,并可选地预置 shader 路径。 |
| [Destructor](Destructor.md) | 默认析构;不会自动释放内部 RHI 资源。 |
| [SetShaderPath](SetShaderPath.md) | 更新当前要加载的 shader 路径,并清空已创建资源。 |
| [GetShaderPath](GetShaderPath.md) | 返回当前记录的 shader 路径。 |
| [Shutdown](Shutdown.md) | 销毁已创建的 pipeline、descriptor 和 shader handle。 |
| [Render](Render.md) | 读取 object-id SRV并把轮廓或 debug mask 写入颜色目标。 |
## 真实使用位置
- `editor/src/Viewport/Passes/SceneViewportSelectionOutlinePass.cpp``SceneViewportSelectionOutlinePassRenderer` 包装它
- `editor/src/Viewport/Passes/SceneViewportSelectionOutlinePass.cpp``SceneViewportSelectionOutlinePassRenderer` 包装它
并通过 `GetSceneViewportObjectIdOutlineShaderPath()` 注入 editor-owned shader 路径。
- [SceneViewportRenderPlan](../../../Editor/Viewport/SceneViewportRenderPlan/SceneViewportRenderPlan.md) 决定当前帧是否要创建 selection outline pass。
- [CameraRenderer](../../CameraRenderer/CameraRenderer.md) 在主场景与 object-id pass 之后执行这些 `postScenePasses`
- `editor/src/Viewport/ViewportHostRenderFlowUtils.h` 当前为 Scene View 组装默认橙色、`2px` 的 outline style。
@@ -73,6 +88,9 @@
## 相关文档
- [Passes](../Passes.md)
- [SetShaderPath](SetShaderPath.md)
- [GetShaderPath](GetShaderPath.md)
- [ObjectIdOutlineStyle](../ObjectIdOutlineStyle/ObjectIdOutlineStyle.md)
- [CameraRenderer](../../CameraRenderer/CameraRenderer.md)
- [RenderSurface](../../RenderSurface/RenderSurface.md)
- [SceneViewportShaderPaths](../../../Editor/Viewport/SceneViewportShaderPaths/SceneViewportShaderPaths.md)