UnityGaussianSplatting - Unity 中的玩具高斯拼接可视化

Created at: 2023-08-25 03:34:46
Language: C#

玩具高斯拼接游乐场在团结

SIGGRAPH 2023 有一篇由 Kerbl、Kopanas、Leimkühler、Drettakis 撰写的论文“用于实时辐射场渲染的 3D 高斯喷发”,看起来很酷!查看他们的网站、源代码存储库、数据集等。

我决定尝试在 Unity 中实现实时可视化部分(即采用已经生成的高斯 splat “模型”文件的部分)。

截图

原始纸质代码有一个纯粹基于 CUDA 的实时渲染器;其他人已经完成了自己的实现(例如cvlab-EPFL的WebGPU万美华里的Taichi等)。

到目前为止,这里的代码是从阅读论文(以及早期关于 EWA splatting 的文献)、查看官方 CUDA 实现等中随机拼凑在一起的。当前状态:

  • 该代码不使用纸张中的“基于瓷砖的板片光栅器”位;它只是将每个高斯板绘制为覆盖其范围的屏幕空间对齐矩形。
  • Splat 颜色累积是通过从前到后渲染来完成的,混合模式会产生与其基于磁贴的渲染器相同的累积颜色。
  • Splat 排序是通过 AMD FidelityFX 派生的基数排序完成的,或者(在 DX11 上)使用从 Unity HDRP 代码库中提取的 GPU 二元排序完成的。

用法

⚠️注意:这都是一个玩具,它不健壮,它不能优雅地处理错误,它不能与“渲染的其余部分”很好地交互或复合,它不快,等等。另外,暂时不要提交错误或问题;我很可能会忽略他们,为所欲为。我告诉过你!⚠️

首先下载或克隆此存储库,并作为 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 轴镜像,因此在示例场景中,对象具有这样的变换设置,并且摄像机被设置为子对象。

就是这样!

我在某些时候可能会或可能不会做的事情的愿望清单:

  • [x] 使其尊重游戏对象转换
  • [ ] 使渲染更快(实际平铺计算着色器光栅器)
  • [x] 查看使数据集更小(磁盘上和内存中)的方法(博客文章))
  • [x] 更好地与场景中可能的渲染“其余部分”集成 (BiRP)
  • [ ] 也许看看让它在 URP/HDRP 中工作?还不确定
  • [x] 使排序更快(黑调 -> FidelityFX 基数排序)

写文章

我自己关于这一切的博客文章(到目前为止...没那么多!

性能数字:

报纸上的“自行车”场景,有 6.1M 的 splats 和第一个摄像头,以 1200x797 的分辨率渲染,处于“中等”资产质量级别(273MB 资产文件):

  • Windows (NVIDIA RTX 3080 Ti):
    • 官方SBIR查看器:7.4毫秒(135帧)。4.8GB 显存使用量。
    • Unity,DX12或Vulkan:12.6毫秒(79FPS)-9.4毫秒渲染,2.4毫秒排序,0.7毫秒板板视图计算1.2GB VRAM使用量。
    • Unity,DX11:20.8毫秒(48FPS)-9.6毫秒渲染,10.4毫秒排序,0.6毫秒板片视图计算。
  • Mac (Apple M1 Max):
    • 统一,金属:31.8毫秒(31帧)。

除了加载到 GPU 内存中的高斯 splat 资产外,目前每个 splat 还需要大约 48 字节的 GPU 内存(用于排序、缓存视图相关数据等)。

使用的外部代码