7.8 KiB
7.8 KiB
3DGS-D3D12 最小可行系统计划
日期:2026-04-12
1. 文档定位
这份计划用于指导 D:\Xuanchi\Main\XCEngine\mvs\3DGS-D3D12 的最小可行系统落地。
当前任务边界已经明确:
- 只允许在
mvs/3DGS-D3D12目录内开发与新增文件。 engine代码只能引用,禁止修改。- 图形抽象层只能使用现有
engine提供的RHI接口。 - 本轮目标是先把 3DGS 的最小可行系统跑通,而不是把它正式并入引擎主线。
- 本轮明确不引入
chunk机制。
因此,这份计划不是“继续修补引擎内已有的 GaussianSplat 路径”,而是“在 MVS 目录内重新搭一条干净的、可验证的、无 chunk 的 3DGS-D3D12 最小链路”。
2. 参考实现与职责拆分
本轮只参考两条现有实现,各自承担不同职责:
2.1 mvs/3DGS Unity Renderer
用途:
- 参考
.ply的读取方式。 - 参考如何从 PLY 属性中提取 3DGS 所需原始数据。
- 参考资源准备阶段的数据布局与字段含义。
注意:
- 这里只借鉴导入与数据准备思路。
- 不照搬 Unity Editor 资产工作流。
- 不引入 chunk。
2.2 mvs/3DGS-Unity
用途:
- 参考“干净的无 chunk 渲染路径”。
- 参考
prepare -> sort -> draw -> composite的最小闭环。 - 参考 3DGS 在屏幕空间椭圆展开、混合与合成时的核心着色器语义。
注意:
- 这里重点参考渲染过程,而不是 Unity 的宿主框架。
- 不把 Unity 的
ScriptableRenderPass、资产导入器、Inspector 等编辑器逻辑带入本轮实现。
3. 首轮目标
首轮只完成以下闭环:
- 在
mvs/3DGS-D3D12内部加载room.ply。 - 将 PLY 中的高斯数据转换为无 chunk 的运行时缓冲。
- 通过现有
RHI完成 D3D12 路径下的最小渲染。 - 输出一张稳定可观察的结果图,证明房间场景已经被正确绘制。
首轮验收标准:
- 程序能独立编译与运行。
- 不依赖修改
engine才能成立。 - 渲染结果不再是纯黑、纯白或明显错误的撕裂图。
- 渲染链路中不存在任何 chunk 数据结构、chunk 缓冲或 chunk 可见性阶段。
4. 非目标
本轮明确不做:
- 不并入 editor。
- 不接入引擎现有 Renderer 主线。
- 不做 OpenGL / Vulkan 多后端对齐。
- 不做正式资源缓存格式。
- 不做 chunk、cluster、LOD、streaming 等优化层。
- 不做 compute 之外的额外架构扩展。
- 不为迎合当前 MVS 去修改
engine的RHI、Renderer、Resources。
5. 约束与执行原则
5.1 目录约束
本轮新增内容应尽量收敛在 mvs/3DGS-D3D12 内,例如:
src/:程序入口、渲染器、相机、数据上传。include/:本地头文件。shaders/:本地 HLSL 或中间 shader 资源。assets/:本地测试资源或生成物描述。third_party/:仅当 MVS 自己确实需要额外小型依赖时使用。
5.2 RHI 使用原则
- 只调用现有
engine的RHI公共接口。 - 如果发现最小系统缺失某项能力,优先在 MVS 内通过更简单的组织方式规避。
- 若确实被
RHI能力边界阻塞,先记录问题并汇报,不允许直接改engine。
5.3 数据路径原则
- 整个系统只保留 positions、other、color、SH 等无 chunk 基础数据。
- 不生成 chunk header。
- 不上传 chunk buffer。
- 不做 visible chunk 标记。
- 不保留任何为了兼容旧 chunk 方案而加的临时分支。
6. 技术路线
Phase 1:梳理 3DGS-D3D12 的骨架与构建入口
目标:
- 确认
mvs/3DGS-D3D12当前是否只有room.ply。 - 建立最小的可执行工程骨架。
- 打通对
engine中RHI的引用与链接。
任务:
- 规划
CMakeLists.txt与目录结构。 - 建立窗口、设备、交换链、命令提交、离屏或在屏渲染的最小入口。
- 跑通一个“清屏可显示”的基础版本。
验收:
3DGS-D3D12可独立编译。- 程序能启动并输出基础画面。
Phase 2:实现无 chunk 的 PLY 读取与运行时数据打包
目标:
- 参考
mvs/3DGS Unity Renderer,在 MVS 内部完成 PLY 读取。 - 输出适合渲染阶段直接上传的高斯原始数组。
任务:
- 解析 PLY header 与顶点属性。
- 提取 position、rotation、scale、opacity、color/SH 等字段。
- 明确字段的排列顺序、类型与归一化方式。
- 生成 MVS 本地
GaussianSplatSceneData。
验收:
room.ply可被成功读取。- 点数量、字段长度、边界盒等基础统计合理。
- 整条导入链中完全没有 chunk 概念。
Phase 3:对齐无 chunk 的 GPU 数据布局与上传
目标:
- 把导入结果上传到 GPU。
- 数据布局尽量贴近
mvs/3DGS-Unity的渲染输入。
任务:
- 设计 positions / other / color / SH 的 GPU buffer。
- 建立与着色器绑定一致的 SRV/UAV 视图。
- 为排序与绘制准备 index、distance、view-data 等工作缓冲。
验收:
- GPU 侧所有关键缓冲都能正确创建。
- 每个绑定槽位与 shader 语义一一对应。
- 不包含 chunk buffer / visible chunk buffer。
Phase 4:先打通 prepare 与 sort
目标:
- 先验证“高斯数据被相机看到并被正确排序”。
- 在 draw 之前把中间结果可视化或可检查化。
任务:
- 参考
mvs/3DGS-Unity的 prepare 语义,计算每个 splat 的 view-space 信息。 - 生成排序距离。
- 跑通最小排序路径。
- 必要时增加调试输出,用于检查 order / distance / 计数是否异常。
验收:
- prepare 结果不是全零或明显错误。
- sort 输出索引顺序稳定。
Phase 5:对齐 draw 与 composite
目标:
- 参考
mvs/3DGS-Unity的“干净无 chunk 渲染路径”把核心画面先画出来。
任务:
- 对齐 Gaussian splat draw shader 的主要输入输出语义。
- 对齐椭圆展开、覆盖范围与透明混合约定。
- 建立 accumulation target。
- 建立 composite pass,把 accumulation 结果合回最终颜色。
验收:
- 输出图中能看出
room.ply对应的房间结构。 - 不出现整屏纯黑、纯白、随机撕裂。
Phase 6:收口与验证
目标:
- 固化最小系统结果,形成稳定基线。
任务:
- 规范运行命令与资源路径。
- 输出一张固定命名的结果图作为检查基线。
- 清理调试残留与临时分支。
- 补一份 MVS 内局部说明文档。
验收:
- 代码、资源、着色器都收敛在
mvs/3DGS-D3D12。 - 运行方式清晰。
- 基线截图稳定。
7. 关键风险
7.1 PLY 属性语义与当前样例不一致
如果 room.ply 的字段命名、顺序或编码方式与参考加载器假设不一致,最先要修的是导入器映射,不是渲染器。
7.2 RHI 能力与参考实现存在接口差
如果 Unity 参考依赖的某些资源绑定或 compute 流程不能直接一比一照搬,本轮优先在 mvs/3DGS-D3D12 内部重排执行方式,而不是去动 engine。
7.3 排序与混合契约不一致
3DGS 最容易出错的不是“有没有画出来”,而是排序方向、alpha 累积与 composite 契约是否一致。本轮必须把这三者当成同一个问题处理,禁止分开打补丁。
8. 本轮完成后的下一步
当 mvs/3DGS-D3D12 的无 chunk 最小系统跑通后,下一步才有意义讨论:
- 是否把这条路径收编进引擎正式 Renderer。
- 是否把 PLY 导入升级成正式资源导入器。
- 是否在引擎层补 structured buffer / compute / renderer pass 抽象。
- 是否接入 editor 与资产缓存。
在这之前,所有工作都应服务于一个目标:
先在 mvs/3DGS-D3D12 内证明“无 chunk 的 3DGS-D3D12 + 现有 RHI”这条路是通的。