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

@@ -22,7 +22,7 @@ InfiniteGridParameters BuildInfiniteGridParameters(const InfiniteGridPassData& d
## 测试覆盖 ## 测试覆盖
`tests/editor/test_scene_viewport_overlay_renderer.cpp` 当前验证了: `tests/Editor/test_scene_viewport_overlay_renderer.cpp` 当前验证了:
- 间距始终落在十进制尺度上。 - 间距始终落在十进制尺度上。
- 水平平移不影响参数。 - 水平平移不影响参数。

View File

@@ -6,13 +6,24 @@
**头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h` **头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h`
**描述**: 在场景颜色目标上叠加编辑器无限地面网格的内建全屏 pass。 **描述**: 在场景颜色目标上叠加无限地面网格的底层全屏 pass;真正使用哪份 shader 由调用方通过 `shaderPath` 注入
## 概述 ## 概述
`BuiltinInfiniteGridPass` 是当前 Scene View 里“地面参考网格”效果的实际执行者。 `BuiltinInfiniteGridPass` 是当前 Scene View 里“地面参考网格”效果的实际执行者。
它消费一份 [InfiniteGridPassData](InfiniteGridPassData.md),在运行时先推导 [InfiniteGridParameters](InfiniteGridParameters.md),再用 builtin shader 把网格直接混合到目标颜色附件上。 它消费一份 [InfiniteGridPassData](InfiniteGridPassData.md),在运行时先推导
[InfiniteGridParameters](InfiniteGridParameters.md),再用当前配置的 shader 资源把网格直接混合到目标颜色附件上。
这个类当前不再自己决定“Scene View grid shader 到底是哪一份资源”。源码里的职责边界已经变成:
- `BuiltinInfiniteGridPass`
只负责资源创建、常量写入和一次全屏三角形执行。
- editor 调用方
通过 [SetShaderPath](SetShaderPath.md) 或构造函数参数注入具体 shader 路径。
- `SceneViewportGridPass`
负责把 [SceneViewportShaderPaths](../../../Editor/Viewport/SceneViewportShaderPaths/SceneViewportShaderPaths.md)
生成的 editor 资源路径传进来。
## 关键输入 ## 关键输入
@@ -23,14 +34,15 @@
## 当前实现流程 ## 当前实现流程
1. 先校验 `data.valid``RenderContext::IsValid()``backendType == D3D12` 1. 先校验 `data.valid``RenderContext::IsValid()``backendType == D3D12`
2. 通过 `EnsureInitialized()` 惰性创建 pipeline layout、pipeline state 和常量描述符。 2. 通过 `EnsureInitialized()` 惰性创建 pipeline layout、pipeline state 和常量描述符;这一步要求 `shaderPath` 非空且可成功加载
3. 从相机姿态推导网格参数,并构建 view-projection 常量。 3. 从相机姿态推导网格参数,并构建 view-projection 常量。
4. 把第一个颜色附件和深度附件绑定为渲染目标。 4. 把第一个颜色附件和深度附件绑定为渲染目标。
5. 以全屏三角形方式发出一次 `Draw(3, 1, 0, 0)` 5. 以全屏三角形方式发出一次 `Draw(3, 1, 0, 0)`
## 当前实现边界 ## 当前实现边界
- 当前只支持 `D3D12` builtin shader variant。 - 当前只支持 `D3D12` shader variant。
- 在第一次创建资源之前必须先提供有效 `shaderPath`;空路径会记录错误并返回 `false`
- 只写入 `surface` 的第一个颜色附件。 - 只写入 `surface` 的第一个颜色附件。
- 视口和裁剪矩形使用 `surface.GetWidth()` / `GetHeight()`,不是自定义 render area。 - 视口和裁剪矩形使用 `surface.GetWidth()` / `GetHeight()`,不是自定义 render area。
- 网格参数完全由当前相机高度与朝向启发式推导,还没有暴露成更完整的编辑器样式配置。 - 网格参数完全由当前相机高度与朝向启发式推导,还没有暴露成更完整的编辑器样式配置。
@@ -39,6 +51,10 @@
| 成员 | 说明 | | 成员 | 说明 |
|------|------| |------|------|
| [Constructor](Constructor.md) | 创建 pass并可选地预置 shader 路径。 |
| [Destructor](Destructor.md) | 默认析构;不会自动代替 `Shutdown()` 释放内部 RHI 资源。 |
| [SetShaderPath](SetShaderPath.md) | 更新当前要加载的 shader 路径,并清空已创建资源。 |
| [GetShaderPath](GetShaderPath.md) | 返回当前记录的 shader 路径。 |
| [InfiniteGridPassData](InfiniteGridPassData.md) | 输入相机数据。 | | [InfiniteGridPassData](InfiniteGridPassData.md) | 输入相机数据。 |
| [InfiniteGridParameters](InfiniteGridParameters.md) | 推导后的网格尺度参数。 | | [InfiniteGridParameters](InfiniteGridParameters.md) | 推导后的网格尺度参数。 |
| [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md) | 从输入相机数据生成当前网格参数。 | | [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md) | 从输入相机数据生成当前网格参数。 |
@@ -47,14 +63,20 @@
## 真实使用位置 ## 真实使用位置
- `editor/src/Viewport/Passes/SceneViewportGridPass.cpp``SceneViewportGridPassRenderer` 包装它,并把它挂进 Scene View 的 `postScenePasses` - `editor/src/Viewport/Passes/SceneViewportGridPass.cpp``SceneViewportGridPassRenderer` 包装它,
并通过 `GetSceneViewportInfiniteGridShaderPath()` 注入 editor-owned shader 路径,再把它挂进 Scene View 的 `postScenePasses`
- [SceneViewportRenderPlan](../../../Editor/Viewport/SceneViewportRenderPlan/SceneViewportRenderPlan.md) 决定当前帧是否需要创建这条 pass。 - [SceneViewportRenderPlan](../../../Editor/Viewport/SceneViewportRenderPlan/SceneViewportRenderPlan.md) 决定当前帧是否需要创建这条 pass。
- `tests/editor/test_scene_viewport_overlay_renderer.cpp` 固定了网格参数推导规则。 - `tests/Editor/test_scene_viewport_overlay_renderer.cpp` 固定了网格参数推导规则。
## 相关文档 ## 相关文档
- [Passes](../Passes.md) - [Passes](../Passes.md)
- [Constructor](Constructor.md)
- [Destructor](Destructor.md)
- [SetShaderPath](SetShaderPath.md)
- [GetShaderPath](GetShaderPath.md)
- [InfiniteGridPassData](InfiniteGridPassData.md) - [InfiniteGridPassData](InfiniteGridPassData.md)
- [InfiniteGridParameters](InfiniteGridParameters.md) - [InfiniteGridParameters](InfiniteGridParameters.md)
- [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md) - [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md)
- [SceneViewportRenderPlan](../../../Editor/Viewport/SceneViewportRenderPlan/SceneViewportRenderPlan.md) - [SceneViewportRenderPlan](../../../Editor/Viewport/SceneViewportRenderPlan/SceneViewportRenderPlan.md)
- [SceneViewportShaderPaths](../../../Editor/Viewport/SceneViewportShaderPaths/SceneViewportShaderPaths.md)

View File

@@ -0,0 +1,52 @@
# BuiltinInfiniteGridPass::Constructor
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `constructor`
**头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h`
## 签名
```cpp
BuiltinInfiniteGridPass(Containers::String shaderPath = Containers::String());
```
## 作用
创建一个尚未分配 GPU 资源的 grid pass 对象,并可选地预置 shader 路径。
## 当前实现行为
当前构造函数只做一件事:
```cpp
m_shaderPath = std::move(shaderPath);
```
这意味着:
- 不会在构造阶段加载 shader。
- 不会提前创建 pipeline layout、pipeline state 或 descriptor set。
- 所有真实 GPU 资源都延迟到第一次 [Render](Render.md) 成功进入初始化路径时创建。
- 如果构造时传入空路径,后续初始化会要求调用方先补 [SetShaderPath](SetShaderPath.md)。
## 初始化后状态
构造后对象处于“空缓存”状态:
- `m_device == nullptr`
- `m_pipelineLayout == nullptr`
- `m_pipelineState == nullptr`
- `m_constantPool == nullptr`
- `m_constantSet == nullptr`
- `m_builtinInfiniteGridShader` 为空
- `m_shaderPath` 保留构造函数传入值
## 相关文档
- [BuiltinInfiniteGridPass](BuiltinInfiniteGridPass.md)
- [SetShaderPath](SetShaderPath.md)
- [GetShaderPath](GetShaderPath.md)
- [Render](Render.md)
- [Shutdown](Shutdown.md)

View File

@@ -0,0 +1,28 @@
# BuiltinInfiniteGridPass::Destructor
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `destructor`
**头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h`
## 签名
```cpp
~BuiltinInfiniteGridPass() = default;
```
## 作用
销毁 `BuiltinInfiniteGridPass` 对象本身。
## 当前语义
- 当前是默认析构函数,不会自动代替 [Shutdown](Shutdown.md) 释放内部 RHI 资源。
- 如果这个类被长期持有为 renderer 成员,调用方应在销毁前显式执行 `Shutdown()`
- 析构不会清空或验证 `m_shaderPath`;路径只影响后续初始化,而不是对象生命期终结。
## 相关文档
- [BuiltinInfiniteGridPass](BuiltinInfiniteGridPass.md)
- [Shutdown](Shutdown.md)

View File

@@ -0,0 +1,28 @@
# BuiltinInfiniteGridPass::GetShaderPath
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `method`
**头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h`
## 签名
```cpp
const Containers::String& GetShaderPath() const;
```
## 作用
返回这个 grid pass 当前记录的 shader 路径。
## 当前语义
- 返回的是内部 `m_shaderPath` 的常量引用。
- 构造后或调用 [SetShaderPath](SetShaderPath.md) 后,这里反映的就是下一次初始化将使用的路径。
- 当前值允许为空;空路径本身不是非法状态,但后续资源创建会失败。
## 相关文档
- [SetShaderPath](SetShaderPath.md)
- [Render](Render.md)

View File

@@ -1,5 +1,13 @@
# BuiltinInfiniteGridPass::Render # BuiltinInfiniteGridPass::Render
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `method`
**头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h`
## 签名
```cpp ```cpp
bool Render( bool Render(
const RenderContext& renderContext, const RenderContext& renderContext,
@@ -7,26 +15,30 @@ bool Render(
const InfiniteGridPassData& data); const InfiniteGridPassData& data);
``` ```
## 行为说明 ## 作用
当前实现会: 当前无限网格效果绘制到 `surface` 的第一个颜色附件上。
1. 要求 `data.valid``renderContext.IsValid()`,且后端必须是 `D3D12` ## 当前实现流程
2. 惰性初始化 shader、pipeline layout、pipeline state 和常量 descriptor。
3. 校验颜色附件与深度附件 1. 如果 `data.valid == false``renderContext` 无效或后端不是 `D3D12`,直接返回 `false`
4. 调用 [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md) 生成网格参数 2. 调用 `EnsureInitialized(renderContext)`;如果当前 `shaderPath` 为空,或配置路径下的 shader 无法加载,也会在这里失败
5. 构建 view-projection 常量并写入 descriptor set 3. 检查颜色附件和深度附件,要求 grid pass 具备完整的颜色与深度目标
4. 调用 [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md) 生成网格参数,并构建 view-projection 常量。
5. 把常量写入 descriptor set。
6. 绑定第一个颜色附件和深度附件。 6. 绑定第一个颜色附件和深度附件。
7. 以全屏三角形方式执行一次 `Draw(3, 1, 0, 0)` 7. 以全屏三角形方式执行一次 `Draw(3, 1, 0, 0)`
## 当前限制 ## 关键语义
- 视口与 scissor 总是覆盖整张 surface不读取 `surface.GetRenderArea()` - 这条路径不再隐式依赖 engine builtin shader调用方必须先通过构造函数或 [SetShaderPath](SetShaderPath.md) 提供有效 shader 路径
- pass 本身不做资源状态切换。 - pass 本身不做资源状态切换。
- 只写第一个颜色附件 - viewport 与 scissor 总是覆盖整张 surface不读取 `surface.GetRenderArea()`
- 当前只写第一个颜色附件。
## 相关文档 ## 相关文档
- [BuiltinInfiniteGridPass](BuiltinInfiniteGridPass.md) - [BuiltinInfiniteGridPass](BuiltinInfiniteGridPass.md)
- [SetShaderPath](SetShaderPath.md)
- [InfiniteGridPassData](InfiniteGridPassData.md) - [InfiniteGridPassData](InfiniteGridPassData.md)
- [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md) - [BuildInfiniteGridParameters](BuildInfiniteGridParameters.md)

View File

@@ -0,0 +1,37 @@
# BuiltinInfiniteGridPass::SetShaderPath
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `method`
**头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h`
## 签名
```cpp
void SetShaderPath(const Containers::String& shaderPath);
```
## 作用
更新这个 grid pass 后续初始化要加载的 shader 路径。
## 当前实现行为
当前实现按下面顺序处理:
1. 如果新旧路径完全相同,直接返回。
2. 调用 `DestroyResources()`,释放当前缓存的 pipeline、descriptor 和 shader handle。
3.`m_shaderPath` 更新为传入值。
## 关键语义
- 改路径会立刻丢弃当前已创建的 GPU 资源,等待下一次 [Render](Render.md) 重新初始化。
- 允许传入空路径;但之后第一次创建资源会因为缺少注入路径而失败。
- 这个方法只改“后续要加载哪份 shader”不立即触发加载。
## 相关文档
- [GetShaderPath](GetShaderPath.md)
- [Render](Render.md)
- [Shutdown](Shutdown.md)

View File

@@ -1,19 +1,40 @@
# BuiltinInfiniteGridPass::Shutdown # BuiltinInfiniteGridPass::Shutdown
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `method`
**头文件**: `XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h`
## 签名
```cpp ```cpp
void Shutdown(); void Shutdown();
``` ```
## 行为说明 ## 作用
当前实现直接销毁内部缓存的: 释放这个 grid pass 已创建的内部 GPU 资源和当前配置路径对应的 shader handle。
- pipeline state ## 当前实现行为
- 常量 descriptor pool / set
- pipeline layout 当前实现直接调用 `DestroyResources()`,并按顺序销毁:
- builtin infinite-grid shader handle
1. `m_pipelineState`
2. `m_constantSet`
3. `m_constantPool`
4. `m_pipelineLayout`
5. `m_builtinInfiniteGridShader`
6. `m_device` / `m_backendType` 等缓存状态
## 关键语义
- 对尚未初始化过的对象调用 `Shutdown()` 是安全的。
- `Shutdown()` 不会清空 `m_shaderPath`;后续仍可重新 [Render](Render.md) 并按当前路径懒创建资源。
- 默认析构函数不会自动代替它执行清理。
## 相关文档 ## 相关文档
- [BuiltinInfiniteGridPass](BuiltinInfiniteGridPass.md) - [BuiltinInfiniteGridPass](BuiltinInfiniteGridPass.md)
- [Destructor](Destructor.md)
- [Render](Render.md) - [Render](Render.md)

View File

@@ -6,7 +6,7 @@
**头文件**: `XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h` **头文件**: `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 框架。 因此它更接近一个“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 和选中对象列表。 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。 3.`surface.GetWidth()` / `GetHeight()` 计算视口尺寸与 texel size。
4.`EncodeObjectIdToColor()` 把选中对象 ID 编码进常量缓冲,最多写入 `kMaxSelectedObjectCount = 256` 项。 4.`EncodeObjectIdToColor()` 把选中对象 ID 编码进常量缓冲,最多写入 `kMaxSelectedObjectCount = 256` 项。
5. 绑定一个 CBV set 和一个 SRV set设置目标为 `surface` 的第一个颜色附件。 5. 绑定一个 CBV set 和一个 SRV set设置目标为 `surface` 的第一个颜色附件。
@@ -43,6 +53,7 @@
## 生命周期 ## 生命周期
- [Constructor](Constructor.md) 只做状态清零,不会立刻创建 GPU 资源。 - [Constructor](Constructor.md) 只做状态清零,不会立刻创建 GPU 资源。
- [SetShaderPath](SetShaderPath.md) 更新路径时,会立刻销毁当前缓存的 RHI 资源,等待下一次 `Render()` 重新初始化。
- 第一次 [Render](Render.md) 成功进入初始化路径时,才会真正创建 descriptor 和 PSO。 - 第一次 [Render](Render.md) 成功进入初始化路径时,才会真正创建 descriptor 和 PSO。
- [Shutdown](Shutdown.md) 会显式销毁所有内部缓存对象。 - [Shutdown](Shutdown.md) 会显式销毁所有内部缓存对象。
- [Destructor](Destructor.md) 当前是默认析构,因此如果把它作为长期 renderer 成员使用,调用方仍需在销毁前显式执行 `Shutdown()` - [Destructor](Destructor.md) 当前是默认析构,因此如果把它作为长期 renderer 成员使用,调用方仍需在销毁前显式执行 `Shutdown()`
@@ -50,6 +61,7 @@
## 当前实现边界 ## 当前实现边界
- 只接受 `D3D12`,其它后端直接返回 `false` - 只接受 `D3D12`,其它后端直接返回 `false`
- 在第一次创建资源前必须先提供有效 `shaderPath`;空路径会记录错误并返回 `false`
- 不处理资源状态切换,也不负责清屏;这些由调用方保证。 - 不处理资源状态切换,也不负责清屏;这些由调用方保证。
- 当前完全忽略 `surface.GetRenderArea()`viewport 和 scissor 都直接取整张 surface 的宽高。 - 当前完全忽略 `surface.GetRenderArea()`viewport 和 scissor 都直接取整张 surface 的宽高。
- 只使用第一个颜色附件;多 render target 场景不会同步写其它附件。 - 只使用第一个颜色附件;多 render target 场景不会同步写其它附件。
@@ -58,14 +70,17 @@
| 方法 | 说明 | | 方法 | 说明 |
|------|------| |------|------|
| [Constructor](Constructor.md) | 创建一个空的 outline pass 对象。 | | [Constructor](Constructor.md) | 创建一个 outline pass 对象,并可选地预置 shader 路径。 |
| [Destructor](Destructor.md) | 默认析构;不会自动释放内部 RHI 资源。 | | [Destructor](Destructor.md) | 默认析构;不会自动释放内部 RHI 资源。 |
| [SetShaderPath](SetShaderPath.md) | 更新当前要加载的 shader 路径,并清空已创建资源。 |
| [GetShaderPath](GetShaderPath.md) | 返回当前记录的 shader 路径。 |
| [Shutdown](Shutdown.md) | 销毁已创建的 pipeline、descriptor 和 shader handle。 | | [Shutdown](Shutdown.md) | 销毁已创建的 pipeline、descriptor 和 shader handle。 |
| [Render](Render.md) | 读取 object-id SRV并把轮廓或 debug mask 写入颜色目标。 | | [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。 - [SceneViewportRenderPlan](../../../Editor/Viewport/SceneViewportRenderPlan/SceneViewportRenderPlan.md) 决定当前帧是否要创建 selection outline pass。
- [CameraRenderer](../../CameraRenderer/CameraRenderer.md) 在主场景与 object-id pass 之后执行这些 `postScenePasses` - [CameraRenderer](../../CameraRenderer/CameraRenderer.md) 在主场景与 object-id pass 之后执行这些 `postScenePasses`
- `editor/src/Viewport/ViewportHostRenderFlowUtils.h` 当前为 Scene View 组装默认橙色、`2px` 的 outline style。 - `editor/src/Viewport/ViewportHostRenderFlowUtils.h` 当前为 Scene View 组装默认橙色、`2px` 的 outline style。
@@ -73,6 +88,9 @@
## 相关文档 ## 相关文档
- [Passes](../Passes.md) - [Passes](../Passes.md)
- [SetShaderPath](SetShaderPath.md)
- [GetShaderPath](GetShaderPath.md)
- [ObjectIdOutlineStyle](../ObjectIdOutlineStyle/ObjectIdOutlineStyle.md) - [ObjectIdOutlineStyle](../ObjectIdOutlineStyle/ObjectIdOutlineStyle.md)
- [CameraRenderer](../../CameraRenderer/CameraRenderer.md) - [CameraRenderer](../../CameraRenderer/CameraRenderer.md)
- [RenderSurface](../../RenderSurface/RenderSurface.md) - [RenderSurface](../../RenderSurface/RenderSurface.md)
- [SceneViewportShaderPaths](../../../Editor/Viewport/SceneViewportShaderPaths/SceneViewportShaderPaths.md)

View File

@@ -9,16 +9,16 @@
## 签名 ## 签名
```cpp ```cpp
BuiltinObjectIdOutlinePass(); BuiltinObjectIdOutlinePass(Containers::String shaderPath = Containers::String());
``` ```
## 作用 ## 作用
创建一个尚未分配 GPU 资源的 outline pass 对象。 创建一个尚未分配 GPU 资源的 outline pass 对象,并可选地预置 shader 路径
## 当前实现行为 ## 当前实现行为
当前构造函数只做一件事 当前构造函数会先把传入路径存进 `m_shaderPath`,再调用
```cpp ```cpp
ResetState(); ResetState();
@@ -26,9 +26,10 @@ ResetState();
这意味着: 这意味着:
- 不会在构造阶段加载 builtin shader。 - 不会在构造阶段加载 shader。
- 不会提前创建 pipeline layout、pipeline state 或 descriptor set。 - 不会提前创建 pipeline layout、pipeline state 或 descriptor set。
- 所有真实的 GPU 资源准备都延迟到第一次 [Render](Render.md) 成功进入初始化路径时完成。 - 所有真实的 GPU 资源准备都延迟到第一次 [Render](Render.md) 成功进入初始化路径时完成。
- 如果构造时传入空路径,后续初始化会要求调用方先补 [SetShaderPath](SetShaderPath.md)。
## 初始化后状态 ## 初始化后状态
@@ -42,9 +43,12 @@ ResetState();
- `m_texturePool == nullptr` - `m_texturePool == nullptr`
- `m_textureSet == nullptr` - `m_textureSet == nullptr`
- `m_builtinObjectIdOutlineShader` 为空 - `m_builtinObjectIdOutlineShader` 为空
- `m_shaderPath` 保留构造函数传入值
## 相关文档 ## 相关文档
- [BuiltinObjectIdOutlinePass](BuiltinObjectIdOutlinePass.md) - [BuiltinObjectIdOutlinePass](BuiltinObjectIdOutlinePass.md)
- [SetShaderPath](SetShaderPath.md)
- [GetShaderPath](GetShaderPath.md)
- [Render](Render.md) - [Render](Render.md)
- [Shutdown](Shutdown.md) - [Shutdown](Shutdown.md)

View File

@@ -0,0 +1,28 @@
# BuiltinObjectIdOutlinePass::GetShaderPath
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `method`
**头文件**: `XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h`
## 签名
```cpp
const Containers::String& GetShaderPath() const;
```
## 作用
返回这个 outline pass 当前记录的 shader 路径。
## 当前语义
- 返回的是内部 `m_shaderPath` 的常量引用。
- 构造后或调用 [SetShaderPath](SetShaderPath.md) 后,这里反映的就是下一次初始化将使用的路径。
- 当前值允许为空;空路径本身不是非法状态,但后续资源创建会失败。
## 相关文档
- [SetShaderPath](SetShaderPath.md)
- [Render](Render.md)

View File

@@ -24,7 +24,7 @@ bool Render(
## 当前实现流程 ## 当前实现流程
1. 如果 `renderContext` 无效、后端不是 `D3D12``objectIdTextureView == nullptr``selectedObjectIds` 为空,直接返回 `false` 1. 如果 `renderContext` 无效、后端不是 `D3D12``objectIdTextureView == nullptr``selectedObjectIds` 为空,直接返回 `false`
2. 调用 `EnsureInitialized(renderContext)`;如果当前 device/backend 变化,会先销毁旧资源再重建。 2. 调用 `EnsureInitialized(renderContext)`;如果当前 device/backend 变化,会先销毁旧资源再重建。`shaderPath` 为空或配置路径下的 shader 无法加载,也会在这里失败。
3. 检查 `surface.GetColorAttachments()`,要求至少存在一个有效颜色附件。 3. 检查 `surface.GetColorAttachments()`,要求至少存在一个有效颜色附件。
4. 构建 `OutlineConstants`,写入 viewport 尺寸、轮廓颜色、调试开关、像素宽度和最多 `256` 个选中对象编码颜色。 4. 构建 `OutlineConstants`,写入 viewport 尺寸、轮廓颜色、调试开关、像素宽度和最多 `256` 个选中对象编码颜色。
5. 把常量缓冲写到 `m_constantSet`,把 `objectIdTextureView` 绑定到 `m_textureSet` 5. 把常量缓冲写到 `m_constantSet`,把 `objectIdTextureView` 绑定到 `m_textureSet`
@@ -32,6 +32,7 @@ bool Render(
## 关键语义 ## 关键语义
- 这条路径不再隐式依赖 engine builtin outline shader调用方必须先通过构造函数或 [SetShaderPath](SetShaderPath.md) 提供有效路径。
- 当前只使用 `surface` 的第一个颜色附件。 - 当前只使用 `surface` 的第一个颜色附件。
- pass 自己不会做 render target 清空;如果要输出 debug mask 这种“整张替换”的结果,需要由调用方先清空目标。 - pass 自己不会做 render target 清空;如果要输出 debug mask 这种“整张替换”的结果,需要由调用方先清空目标。
- pass 自己也不负责资源状态切换;调用前应保证颜色目标已经在 `RenderTarget` 状态、object-id SRV 已经可读。 - pass 自己也不负责资源状态切换;调用前应保证颜色目标已经在 `RenderTarget` 状态、object-id SRV 已经可读。
@@ -45,5 +46,6 @@ bool Render(
## 相关文档 ## 相关文档
- [BuiltinObjectIdOutlinePass](BuiltinObjectIdOutlinePass.md) - [BuiltinObjectIdOutlinePass](BuiltinObjectIdOutlinePass.md)
- [SetShaderPath](SetShaderPath.md)
- [ObjectIdOutlineStyle](../ObjectIdOutlineStyle/ObjectIdOutlineStyle.md) - [ObjectIdOutlineStyle](../ObjectIdOutlineStyle/ObjectIdOutlineStyle.md)
- [RenderSurface](../../RenderSurface/RenderSurface.md) - [RenderSurface](../../RenderSurface/RenderSurface.md)

View File

@@ -0,0 +1,37 @@
# BuiltinObjectIdOutlinePass::SetShaderPath
**命名空间**: `XCEngine::Rendering::Passes`
**类型**: `method`
**头文件**: `XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h`
## 签名
```cpp
void SetShaderPath(const Containers::String& shaderPath);
```
## 作用
更新这个 outline pass 后续初始化要加载的 shader 路径。
## 当前实现行为
当前实现按下面顺序处理:
1. 如果新旧路径完全相同,直接返回。
2. 调用 `DestroyResources()`,释放当前缓存的 pipeline、descriptor 和 shader handle。
3.`m_shaderPath` 更新为传入值。
## 关键语义
- 改路径会立刻清空当前资源缓存,等待下一次 [Render](Render.md) 按新路径重新初始化。
- 允许传入空路径;但之后第一次创建资源会因为缺少注入路径而失败。
- 这个方法只更新“将要加载的路径”,不立即创建任何 GPU 资源。
## 相关文档
- [GetShaderPath](GetShaderPath.md)
- [Render](Render.md)
- [Shutdown](Shutdown.md)

View File

@@ -14,7 +14,7 @@ void Shutdown();
## 作用 ## 作用
释放这个 outline pass 已经创建的所有内部 GPU 资源和 shader handle。 释放这个 outline pass 已经创建的所有内部 GPU 资源和当前配置路径对应的 shader handle。
## 当前实现行为 ## 当前实现行为

View File

@@ -54,7 +54,7 @@
## 真实使用位置 ## 真实使用位置
- `CameraRenderer::Render()` 在主场景渲染后、`postScenePasses``overlayPasses` 前调用 `m_objectIdPass->Render(...)` - `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/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 是否存在。 - `tests/Resources/Shader/test_shader_loader.cpp` 验证了 builtin object-id shader 的 pass tag 和多后端 variant 是否存在。
## 相关文档 ## 相关文档

View File

@@ -40,8 +40,8 @@
## 测试与真实调用点 ## 测试与真实调用点
- `tests/Rendering/unit/test_camera_scene_renderer.cpp` 验证了 `CameraRenderer` 中 object-id pass 与可选 pass sequence 的接入时机。 - `tests/Rendering/unit/test_camera_scene_renderer.cpp` 验证了 `CameraRenderer` 中 object-id pass 与可选 pass sequence 的接入时机。
- `tests/editor/test_scene_viewport_overlay_renderer.cpp` 固定了 `BuildInfiniteGridParameters(...)` 的十进制尺度、过渡和淡出语义。 - `tests/Editor/test_scene_viewport_overlay_renderer.cpp` 固定了 `BuildInfiniteGridParameters(...)` 的十进制尺度、过渡和淡出语义。
- `tests/editor/test_viewport_render_flow_utils.cpp` 验证了 Scene View render plan 如何组装 grid / selection outline / overlay pass以及 object-id SRV 缺失时的警告路径。 - `tests/Editor/test_viewport_render_flow_utils.cpp` 验证了 Scene View render plan 如何组装 grid / selection outline / overlay pass以及 object-id SRV 缺失时的警告路径。
## 当前实现边界 ## 当前实现边界