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