如果你做过 3D 渲染相关的开发,大概听说过 3D Gaussian Splatting(3D 高斯泼溅,一种把场景表示成大量三维高斯分布点、再直接投影到屏幕进行渲染的新兴技术)。它用一组带颜色和透明度的椭球体描述场景,训练好后能以极高速度生成照片级真实感的新视角画面,比传统 NeRF(神经辐射场,一种用神经网络隐式建模场景的方法)快几个数量级。但长期以来,这类渲染器大多跑在 CUDA 上,意味着你基本被绑死在 NVIDIA 显卡上,而且想嵌进自己的 D3D12 渲染管线非常别扭。DirectXSplat 就是冲着这个痛点来的:一个纯 C++/Direct3D 12 实现的高斯泼溅渲染库,不依赖 CUDA,在 Windows 10/11 上直接跑,而且官方基准测试显示,在同等画质下它的帧率最高能达到 gsplat(目前最流行的 CUDA 高斯泼溅库)的 2.4 倍。

这个项目最让我意外的是性能优势的来源。它并不是靠什么黑魔法,而是把 D3D12 的特性用到了极致:GPU 加速光栅化、显存常驻场景、渲染器内部资源复用,再加上一套精细的 LOD(Level of Detail,细节层次)和显存驻留管理。默认配置里有个 `residencyBudgetGaussians` 参数,限制常驻显存的高斯数量上限;还有 `lod0ScreenRadius`、`lod1ScreenRadius` 这些阈值,根据高斯在屏幕上的投影半径决定用哪一级细节,远的直接跳过。这种按需加载和分级渲染的思路,让它在保持画质的同时把带宽和计算量压得很低。

从工程角度看,DirectXSplat 的 API 设计也很有讲究。它没有搞一套自成一体的运行时,而是让你把渲染命令记录到你自己的 D3D12 command list 里。你的应用负责提供 D3D12 device、direct queue、fence、render target,它只负责往你给的 command list 里写入高斯泼溅的绘制指令。这种“嵌入式”设计对已有渲染引擎非常友好——你不用把整个渲染循环交给它,只需要在合适的位置调用它的 `Render` 函数。它还提供了 `Show(...)` 和 `Draw(...)` 两个便捷 API,前者直接弹出一个交互式查看器,后者离屏渲染一张图并读回 CPU,适合做工具链、冒烟测试和截图。

场景加载方面,它支持 PLY、SPZ、.splat、SOG 以及带 LOD 元数据的格式,基本覆盖了 3DGS 训练输出的主流格式。官方示例里直接加载训练好的 `point_cloud.ply` 就能看,也可以用 `cameras.json` 里的相机位姿来浏览。对于需要动态更新场景的应用,它还提供 chunk 级别的增删改操作,比如 `AddUploadedChunk`、`UpdateUploadedChunk`、`RemoveUploadedChunk`,可以局部修改场景而不用整体重新上传。

基准测试是在 NVIDIA RTX 4070 SUPER 上跑的,对比对象是 gsplat。以 bicycle 数据集为例,DirectXSplat 跑到 382.51 FPS,gsplat 只有 165.82 FPS;garden 数据集是 319.14 vs 131.68;treehill 是 491.86 vs 224.86。PSNR(峰值信噪比,衡量画质还原度的指标)两者几乎一致,说明提速不是靠牺牲画质换来的。测试方法也写得很清楚:只测 resident-scene 单相机 GPU 渲染吞吐,排除场景加载、初始上传、预热、GPU 回读和 UI 开销。

如果你正在做 D3D12 渲染器,或者想把 3DGS 场景嵌进自己的引擎,这个库值得直接拿来用。它通过 CMake FetchContent 就能集成,MIT 协议,依赖也都是宽松许可。需要注意几个坑:`D3D12Context` 只存非拥有指针,不持有 COM 引用,所以 device、queue、fence 的生命周期必须由你管好;渲染和场景变更互斥,`BeginSceneMutation` 和 `EndSceneMutation` 必须成对调用;多个 Renderer 实例可以共享一个 context,但 command list 的录制、队列顺序和 fence 值都得你自己协调。另外,它目前只支持 Windows + D3D12,想跨平台的话还得另想办法。

总的来说,DirectXSplat 给 D3D12 生态补上了一个关键拼图:高性能的 3DGS 渲染不再被 CUDA 垄断。它的性能数据和嵌入式 API 设计,对做实时渲染、数字孪生、游戏编辑器甚至三维扫描工具的人都有直接参考价值。如果你在 Windows 上做图形开发,不妨拉下来跑跑官方 benchmark,看看它在你显卡上的表现。

阅读原文 → 返回 AI 技术文档

内容与图片版权归原作者所有 · 原文: https://github.com/pbkx/DirectXSplat