Gaussian Splatting 的替代方案:Nvidia SVRaster 的 WebGL 实现
samuelm2/svraster-webgl
基于 WebGL 的查看器,用于可视化来自 Nvidia Sparse Voxels Rasterization paper 的稀疏体素场景。 此查看器提供了一种交互式方式,可以通过 web 探索和可视化体素辐射场。 您可以在 vid2scene.com/voxel 试用该查看器。 渲染效果与参考 CUDA 实现不完全相同,但非常相似。
功能特性
-
交互式相机控制:
- 鼠标左键+拖动:环绕相机
- 鼠标右键+拖动:平移相机
- 鼠标滚轮:缩放
- WASD/方向键:移动相机
- Q/E:绕视线方向旋转场景
- 空格键/Shift:向上/向下移动
-
移动设备的触摸控制:
- 单指拖动:环绕
- 双指拖动:平移/缩放
-
性能指标显示 (FPS 计数器)
如何运行
前置条件
在运行项目之前,您需要安装 Node.js 和 NPM(Node Package Manager):
- 安装 Node.js 和 NPM:
- 从 nodejs.org 下载并安装
- 验证安装:
node --version
npm --version
运行项目
要在本地运行此项目:
- 克隆仓库:
git clone https://github.com/samuelm2/svraster-webgl.git
cd svraster-webgl
- 安装依赖:
npm install
- 启动开发服务器:
npm run dev
这将启动 Vite 开发服务器,通常位于 http://localhost:5173
实现和性能说明
- 此查看器使用基于距离的排序方法,而不是论文中描述的依赖于射线方向的 Morton 排序
- 当前的实现只应用了最基本的优化 - 还有很大的性能改进空间。 目前,片段着色器是瓶颈。 也可以降低内存使用量,因为现在没有量化任何东西。 如果您有性能改进建议,请随时提交 PR!
- 在我的笔记本电脑上使用 Laptop 3080 GPU 以约 60-80 FPS 的速度运行
- 在我的 iPhone 13 Pro Max 上以大约 12-20 FPS 的速度运行
- 目前,仅支持使用球谐函数 1 阶训练的场景(因此每个体素总共有 12 个 SH 系数)。 请参阅下面的命令,以使用 sh 1 阶训练您的 SVRaster 场景。
您可以通过 URL 参数 ?samples=X
调整片段着色器中每条射线的密度采样数。 默认值为 3,但可以通过降低此值来获得相当不错的性能提升,但代价是渲染精度略有降低。
URL 参数
查看器支持一些 URL 参数来自定义其行为:
?samples=1
- 调整片段着色器中每条射线的密度采样数(默认值:3)。较低的值会提高性能,但会略微降低渲染精度。?url=https://example.com/myply.ply
- 从指定的 URL 加载自定义 PLY 文件(默认值:来自 HuggingFace 的 pumpkin_600k.ply:https://huggingface.co/samuelm2/voxel-data/blob/main/pumpkin_600k.ply)。 例如,我还有一个 120 万体素的 pumpkin ply,您可以使用此 url 加载:https://vid2scene.com/voxel/?url=https://huggingface.co/samuelm2/voxel-data/resolve/main/pumpkin_1200k.ply?showLoadingUI=true
- 显示 PLY 文件上传 UI,允许用户加载自己的文件。
如何生成自己的场景
如果您有自己的 SVRaster 场景,并且想在此 WebGL 查看器中进行可视化,可以使用此 SVRaster 的 fork 版本,该版本支持 PLY 导出:
- 克隆 forked SVRaster 仓库: github.com/samuelm2/svraster
- 使用 SH 1 阶运行 SVRaster,以创建一个与此查看器兼容的模型:
python train.py --source_path /PATH/TO/COLMAP/SFM/DIR --model_path outputs/pumpkin/ --sh_degree 1 --sh_degree_init 1 --subdivide_max_num 600000
PLY 文件将自动保存在您的 outputs model_path 目录中。
- 对于先前训练的现有 SVRaster 模型,可以使用
convert_to_ply.py
脚本:
python convert_to_ply.py outputs/pumpkin/ outputs/pumpkin/pumpkin.ply
- 打开 WebGL 查看器,并使用 URL 参数或文件上传 UI(或修改代码本身)加载您的自定义 PLY 文件
注意:此过程生成的 PLY 文件非常未优化且未压缩,因此它们可能会很快变得非常大。 我通常使用上面的 subdivide_max_num 标志将体素数量保持在 60 万到 100 万的范围内。
其他说明
这个项目大量使用了 AI 辅助(“vibe coded”)。 我想看看它在图形相关的事情上会怎么样。 我的一些简要想法:它对于样板代码(定义/绑定缓冲区、uniforms 等)非常有用。 我能够在几个小时内获得简单的渲染。 但是,在解决更难的图形错误时,好处要小得多。 有很多次它会朝着完全错误的方向发展,我不得不手动重写部分内容。 但总的来说,我认为对于像这样的较小项目来说,这绝对是一个净收益。 在更复杂的图形引擎/生产环境中,目前的好处可能不太明显。 我对其他人的想法很感兴趣。