SIGGRAPH 2023 有一篇由 Kerbl、Kopanas、Leimkühler、Drettakis 撰写的论文“用于实时辐射场渲染的 3D 高斯喷发”,看起来很酷!查看他们的网站、源代码存储库、数据集等。
我决定尝试在 Unity 中实现实时可视化部分(即采用已经生成的高斯 splat “模型”文件的部分)。
原始纸质代码有一个纯粹基于 CUDA 的实时渲染器;其他人已经完成了自己的实现(例如cvlab-EPFL的WebGPU,万美华里的Taichi等)。
到目前为止,这里的代码是从阅读论文(以及早期关于 EWA splatting 的文献)、查看官方 CUDA 实现等中随机拼凑在一起的。当前状态:
首先下载或克隆此存储库,并作为 Unity (2022.3) 项目打开。请注意,该项目在 Windows 上默认为 DX12,因为那时它可以使用更快的排序例程(DX11 也应该可以工作,但排序会更慢)。
接下来,创建一些GaussianSllat资源:在Unity中打开菜单。在对话框中,将其指向你的高斯 splat “model” 目录(它应该包含 and 在其内部,并且是实际的高斯 Splat 模型,而不是其他东西)。
Tools -> Gaussian Splats -> Create GaussianSplatAsset
cameras.json
point_cloud/iteration_7000/point_cloud.ply
选择所需的压缩选项和输出文件夹,然后按“创建资产”按钮。
如果一切正常,应该有一个GaussianPlat 资产,旁边有一堆数据图像:
由于高斯 splat 模型非常大,因此我在此 Github 存储库中没有包含任何模型。原始的纸质github页面有一个指向其型号的14GB压缩链接。
在具有脚本的游戏对象中,将资产字段指向你创建的资产之一。脚本上有各种控件来调试/可视化数据,以及一个滑块,用于将游戏摄像机移动到资产的摄像机位置之一。
GaussianSplatRenderer
渲染考虑了游戏对象转换矩阵;官方的高斯 Splat 模型似乎都围绕 X 轴旋转了大约 -160 度,并围绕 Z 轴镜像,因此在示例场景中,对象具有这样的变换设置,并且摄像机被设置为子对象。
就是这样!
我在某些时候可能会或可能不会做的事情的愿望清单:
我自己关于这一切的博客文章(到目前为止...没那么多!
报纸上的“自行车”场景,有 6.1M 的 splats 和第一个摄像头,以 1200x797 的分辨率渲染,处于“中等”资产质量级别(273MB 资产文件):
除了加载到 GPU 内存中的高斯 splat 资产外,目前每个 splat 还需要大约 48 字节的 GPU 内存(用于排序、缓存视图相关数据等)。