3D高斯泼溅(3DGS)完全入门:从零理解实时新视角合成
本文适合谁:完全不知道 3DGS 是什么的读者。读完你能理解它为什么让学术界和工业界同时兴奋——从只能靠神经网络慢慢查询,进化到用”高斯颜料球”直接往屏幕上泼。
一、这门技术解决了什么问题
你的手机拍了一张照片。照片是一张二维的图像,记录的是相机在那个位置、那个角度看到的东西。换个位置——哪怕只挪半米——拍出来的就是另一张完全不同的照片。
新视角合成(Novel View Synthesis, NVS) 解决的问题是:给你若干张从已知位置拍的照片,你能生成从任意新位置、新角度看到的画面吗?
听起来像科幻。但是:能。而且 2023 年之后,能实时做了。
3DGS 之前的王者是 NeRF(Neural Radiance Fields, Mildenhall et al., ECCV 2020)——用神经网络记住一个场景。查询摄像头光线上每个点的颜色和透明度,然后把一整条光线上的点”捏合”成像素。效果惊艳,但一个致命问题:渲染一帧需要几秒甚至几十秒。原因是每条光线要跑几百次神经网络——这是个几百次MLP前向传播的问题。
3DGS 换了条完全不同的路。问的不是”这条光线经过哪些点”,而是”屏幕这个像素被哪些高斯椭球覆盖“。把可见关系变成了排序+叠合问题——这正是 GPU 擅长的事情。推理速度从 NeRF 的秒级直接跃迁到 100+ FPS。

二、先建立一个心智模型:三维场景的两种表示法
在理解 3DGS 之前,建立两种三维场景表示法的直觉。
2.1 隐式表示——NeRF 的做法
想象你闭着眼走进一个房间。你想知道”我前方 2 米处、视线往右 30° 的那个点的颜色是什么”。你有一个随身携带的”颜色预测器”——一个神经网络,输入位置坐标 (x, y, z) 和视线方向 (θ, φ),输出那个位置的颜色和密度。
这就是 NeRF 的隐式表示:
其中 是空间位置, 是视线方向, 是 RGB 颜色, 是体积密度。
每次你想画一个像素,就得沿着光线采样上百个点,每个点都跑一遍 F_Θ,然后把颜色沿光线积分:
这就是著名的体渲染积分。点越多的位置透明度越高,最终像素是沿途点的加权平均。优雅,但慢——因为每个像素要跑 N 次神经网络。
2.2 显式表示——3DGS 的做法
现在换个思路。不搞那个”颜色预测器”了。你在房间里直接放置几百万个小颜料球,每个球自带:
- 一个三维位置(球心在哪)
- 一个椭球形状(不是正球,而是可以拉伸和旋转的椭球)
- 一个颜色(从不同角度看可能不同)
- 一个不透明度
当你睁开眼睛看时,每个球直接往你视网膜上投影像素大小的一块颜色。多个球重叠时,按前后顺序叠加在一起——这就是 3DGS 的核心直觉:用显式的三维高斯椭球直接渲染,不跑任何神经网络。
| 特性 | NeRF(隐式) | 3DGS(显式) |
|---|---|---|
| 场景存储方式 | MLP 神经网络权重 | 三维高斯椭球列表 |
| 渲染方式 | 沿光线采样 + 神经网络查询 | 投影椭球 + 混合叠加 |
| 推理速度 | 慢(秒级/帧) | 快(100+ FPS, 毫秒级) |
| 可编辑性 | 困难 | 方便(直接增删椭球) |
| 训练时间 | 小时级 | 20-30 分钟 |
| 代表论文 | NeRF (ECCV 2020) | 3DGS (SIGGRAPH 2023) |
三、一个高斯椭球到底是什么
这是整个 3DGS 的灵魂数据结构。弄懂它,后面渲染管线和训练过程就都是顺理成章的操作。
3.1 一维高斯:从概率分布到”模糊颜料”
学概率论时见过这个:
它是一个钟形曲线——以 为中心, 控制宽度。在 3DGS 里,我们把概率密度替换为不透明度——离中心越远越透明:
中心最不透明,向两边指数衰减。这就是一个”软颜料点”——没有硬边缘,柔性地融入背景。
3.2 三维高斯椭球:旋转 + 拉伸
推广到三维。一个三维高斯分布由均值向量 (中心位置)和协方差矩阵 (形状)定义:
的**特征值**控制三个主轴方向的拉伸程度,**特征向量**控制椭球的朝向。为了让协方差矩阵在优化中始终正定(物理上可解释),3DGS 把它分解成旋转和拉伸的乘积:- —— 三个轴的缩放因子()
- —— 旋转矩阵,由四元数 构造
关键结论:每个高斯椭球的核心参数只有 59 个浮点数。
| 参数 | 维数 | 物理含义 |
|---|---|---|
| 位置 | 3 | 椭球在三维空间中的中心坐标 |
| 缩放 | 3 | 三个主轴方向的半径 |
| 旋转四元数 | 4 | 椭球在空间中的朝向 |
| 不透明度 | 1 | 中心最大不透明度(0 = 完全透明, 1 = 完全不透明) |
| 球谐系数 SH | 48 | 从不同方向看时的颜色(3 阶, 3通道 × 16系数) |
| 合计 | 59 | 约 236 字节/个高斯 |
一个典型场景有 1–5 百万个高斯。总存储约 100–500 MB。
3.3 球谐函数:实现”从不同角度看颜色不同”
如果不加方向依赖,每个高斯球的颜色就是固定的 RGB —— 像漫反射墙一样。但真实世界有高光、镜面反射——同一个点从不同方向看亮度不同。
球谐函数(Spherical Harmonics, SH)是定义在球面上的基函数,像二维的”傅里叶级数”。3DGS 使用 3 阶 SH(共 16 个系数)编码每个 RGB 通道,共 48 个系数:
- 是球谐基函数
- 是每个颜色通道的可学习系数
- 是观察方向
用 3 阶(而非更高阶)是经过权衡的——能捕捉到高光效果,但不至于参数爆炸。

四、渲染管线:从三维高斯到屏幕像素
有了场景中几百万个高斯椭球,怎么把它们变成你屏幕上的像素?四步法,全是 GPU 擅长的操作。
4.1 第一步:投影(Projection)
给定相机位姿(外参 和内参矩阵 ),把三维世界坐标的高斯中心 投影到二维图像平面:
其中 是 的齐次坐标。
协方差矩阵也需要投影。在相机坐标系中,三维协方差 通过 Jacobian 线性化近似投影成二维协方差:
- 是 的旋转部分
- 是透视投影的 Jacobian 矩阵(仿射近似)
4.2 第二步:创建二维高斯斑块(Splatting)
投影后的二维高斯变成一个椭圆形的”斑块”(splat)。对图像平面上的任意点 ,这个斑块的不透明度贡献为:
实际实现中,为了提速,只计算斑块中心周围 半径内的像素——超出范围的贡献几乎为零,直接裁剪掉。
4.3 第三步:按深度排序
场景中可能有几千个椭球投影到同一个像素上。必须按从近到远的顺序叠加——这对应光线先穿过近处物体再到远处物体。
3DGS 使用 GPU 基数排序(Radix Sort),在每个像素内对贡献的高斯斑块按投影深度排序。这不是近似——对每个像素独立排序保证了正确的不透明遮挡。
4.4 第四步:alpha 混合(Alpha Blending)
排序后从最近到最远逐个叠加,计算该像素的最终颜色。这其实就是体渲染积分的离散形式:
- 是"到第 个高斯球为止,还有多少光没被遮挡"
- 是该高斯在这个像素位置的投影不透明度
- 是该高斯从当前观察方向看到的颜色(球谐计算)
当累积不透明度达到 1 时,后面的高斯完全被遮挡,直接跳过——这就是提前终止的early stopping优化。

五、训练过程:用梯度下降画出一个场景
有了前向渲染,剩下的问题就是:给一堆多角度照片,怎么反演出场景中有几百万个高斯椭球,每个参数应该是什么?这就是训练。
5.1 初始化:稀疏得可怜的起点
3DGS 从 SfM(Structure from Motion) 产生的稀疏点云开始——通常只有几千到几万个点(COLMAP 是标准选择)。对比最终百万级高斯,初始只有 1% 的几何信息。
每个 SfM 点变成一个初始高斯:
- 位置 = 点的三维坐标
- 颜色 = 该点在各视角中的平均颜色
- 初始缩放 = 最近邻 SfM 点的平均距离
- 旋转 = 单位四元数(最初是正球体)
- 不透明度 = 0.1(统一初始化)
5.2 损失函数:L1 + SSIM
3DGS 的训练目标很简单:让渲染的图像尽可能接近真实照片。损失函数有两条腿:
- (像素级 L1 损失):驱动颜色的精确匹配。对高频纹理和尖锐边缘宽容度差。
- (结构相似度损失):衡量图像结构一致性。对光照偏移、对比度变化宽容。 通常取 0.2。
两条损失互补——L1 追像素精度,SSIM 追结构合理性。这种组合也是 NeRF 后期工作的标准做法(Müller et al., Instant-NGP, SIGGRAPH 2022)。
5.3 优化器:Adam
3DGS 使用 Adam 优化器(Kingma & Ba, 2015),没有太多玄学。对不同参数使用不同学习率:
| 参数 | 初始学习率 | 衰减策略 |
|---|---|---|
| 位置 | 指数衰减到 0.0000016 | |
| 缩放 | 0.005 | 保持不变 |
| 旋转 | 0.001 | 保持不变 |
| 不透明度 | 0.05 | 保持不变 |
| 球谐系数 | 0.0025 | 保持不变 |
5.4 自适应密度控制(ADC):训练的核心魔法
这是 3DGS 论文最精妙的部分。光有 Adam 梯度下降不够——初始几千个高斯分布太稀疏,无法覆盖场景细节。
分裂(Split):当一个高斯的梯度太大(意味着它的位置和形状非常错误),且这个高斯的尺寸超过阈值,就分裂成两个更小的高斯。新位置的采样技巧:在高斯分布的主轴方向随机采样。
- 梯度阈值:
克隆(Clone):当梯度大但高斯尺寸很小,说明场景需要更密集的覆盖——克隆这个高斯并放在附近。
- 分裂和克隆交替触发,每 100 步执行一次
删除(Prune):当不透明度 衰减到接近零,或世界空间尺寸过大(覆盖半个场景)时,删除该高斯。
- 删除阈值:
经过 30,000 步迭代(约 20-30 分钟),高斯数量从初始的千级增长到百万级,场景从模糊变得越来越清晰。

六、为什么这么快:性能解构
3DGS 在 Mip-NeRF 360 数据集上平均 135 FPS(RTX 4090, 1080p),NeRF 的 Instant-NGP 在同一数据集上约 6-10 FPS。差距来自三处:
6.1 不算不透明度的点:GPU 光栅化 vs MLP 查询
NeRF 沿光线均匀采样 128-256 个点,每个点跑一次 MLP。MLP 虽然轻量(8 层, 256 维),但每个像素要跑 200 次。
3DGS 每个像素只处理投影后覆盖该像素的几个高斯——通常 5-20 个(超过 3σ 范围的被裁剪)。不跑 MLP——就是浮点运算和内存读取。
6.2 跳过后面的东西:early stopping
在 alpha 混合中,当累积不透明度 下降到很小的值(比如 0.001),后面高斯对像素的贡献可以忽略。直接终止该像素的计算——跳过高斯排序的主循环。
在室内场景中,early stopping 能跳过 40-60% 的高斯处理。这非常关键——它让渲染的复杂度与场景中可见几何量挂钩,而非场景中所有高斯的总数。
6.3 用 CUDA 定制排序
3DGS 没有用通用的图形 API(OpenGL/Vulkan/DirectX 的混合模式)。作者用 CUDA 内核直接从 Pytorch 张量渲染——定制了 GPU 基数排序和 alpha 混合的 CUDA 实现。这绕过了图形 API 的状态机开销。
一个具体的性能数字(论文 Table 2):
| 方法 | 训练 | 渲染 (FPS) | PSNR |
|---|---|---|---|
| Plenoxels | 11 min | 6.79 | 23.08 |
| Instant-NGP | 5.5 min | 6.22 | 25.43 |
| Mip-NeRF 360 | 48 hours | 0.06 | 29.23 |
| 3DGS | 22 min | 135 | 28.69 |
3DGS 以一己之力把渲染速度提高 20 倍以上,同时保持顶级画质。这是真正的原因。
七、与 NeRF 全系对比:不是简单的”更好”
NeRF 从 2020 到 2023 产生了大量变体,3DGS 几乎每条路都有回应。
| 关键能力 | NeRF 系方法 | 3DGS 对应能力 | 差距 |
|---|---|---|---|
| 反走样(不同分辨率) | Mip-NeRF (Barron et al., ICCV 2021) 用圆锥台代替光线 | Mip-Splatting (Yu et al., CVPR 2024, arXiv:2311.16493) 用 3D 低通滤波限制高斯频率 | 各自有效,不同机制 |
| 表面重建 | NeuS (Wang et al., NeurIPS 2021) 用 SDF 重建表面 | 2DGS (Huang et al., SIGGRAPH 2024, arXiv:2403.17888) 将高斯”压扁”到表面对齐 | 2DGS 更精确,NeurIPS 2024 oral |
| 大规模场景 | Block-NeRF / Mega-NeRF | VastGaussian (Lin et al., CVPR 2024) 分区训练+合并 | 可扩展,仍然有分块接缝问题 |
| 动态场景 | D-NeRF, TiNeuVox | 4DGS (Wu et al., CVPR 2024, arXiv:2310.08528) 学习高斯运动场 | 存储量大,但渲染实时 |
| 可编辑/重光照 | NeRF-W | SuGaR (Guédon & Lepetit, CVPR 2024, arXiv:2311.12775) 绑定高斯到 mesh | 可用,但不如 mesh 成熟 |
| 抗稀疏视角 | RegNeRF, FreeNeRF | 对极少(<10张)输入视角表现劣化 | 结构先验仍有优势 |
关键教训:3DGS 并不在所有场景中都碾压 NeRF。在极度稀疏输入(<10 张照片)场景,NeRF 的 MLP 连续性先验起到的正则化作用更有优势。
八、生态全景:2023-2026 前沿进展
3DGS 论文发表后不到三年,已经生长出一个完整的研究生态系统。
8.1 主线演进
1 | 3DGS (SIGGRAPH 2023) ──→ 解决各种"不够好" |
8.2 2025-2026 新方向
- 大规模城市场景:WildGaussians (3DGS in the Wild, Kulhánek et al., ECCV 2024),CityGaussian,Hierarchical 3DGS for Large Scenes
- 自动驾驶:StreetGaussians, DrivingGaussian (CVPR 2024) — 利用 LiDAR 先验初始高斯
- 与生成式 AI 结合:DreamFusion/3DGS 结合,只用单张图生成三维场景(GaussianObject, LGM)
- 相机位姿同时优化:不依赖 SfM 的稀疏点云(CF-3DGS, DUSt3R)
- 移动端推理:MobileGaussian, FlashGS (NeurIPS 2024) — 手机 GPU 实时渲染
- 3D 分割/语义:Gaussian Grouping, LangSplat(高斯 + CLIP 特征)
8.3 核心开源实现
| 项目 | 特点 | 起步难度 |
|---|---|---|
| graphdeco-inria/gaussian-splatting | 官方实现,论文的原始代码 | ⭐⭐⭐ |
| nerfstudio-project/gsplat | 模块化 CUDA 后端,可插拔到 nerfstudio | ⭐⭐ |
| playcanvas/supersplat | 浏览器内 3DGS 编辑器/查看器 | ⭐ |
| antimatter15/splat | WebGL 查看器,拖入 .ply 即可 | ⭐ |

九、限制和当前瓶颈
诚实地说 3DGS 现在的主要问题:
- 对模糊/光滑表面(如水面、玻璃)表现差——高斯椭球依赖纹理特征来分裂和优化,特征少的区域几何退化
- 极端稀疏视角(<10 张照片)不如 NeRF——高斯缺乏 MLP 那样的平滑先验
- 存储量大——百万高斯 × 236 字节 ≈ 236 MB,但多种压缩方案(LightGaussian 50×, Compact3D)让这个数字下降到实用范围
- 反射/折射不准确——高斯没有光线追踪的物理传输模型,这是根本性的局限
- 训练需要高质量 SFM 位姿——如果 COLMAP 失败(纯色墙面、重复纹理),3DGS 无法初始化
- “漂浮物”问题——训练过程中产生的不准确高斯,尤其是相机从未看过的空间
- 依赖定制 CUDA 实现——不适合直接在 WebGL/Metal 上运行(需要适配层)
十、从零上手:两条路
10.1 想快速体验(1 分钟)
用 Web 查看器看别人训练好的场景:
- 打开 antimatter15/splat 的项目页面
- 下载任何
.ply高斯文件(Polycam, Luma AI 都有公开场景) - 拖入浏览器——实时渲染
10.2 想自己训练(30 分钟)
1 | # 1. 安装官方库(需要 CUDA) |
训练完成后,把 .ply 文件拖入 supersplat 或 antimatter15/splat 的 Web 查看器就能实时旋转查看你的场景。
核心公式速查
| 公式 | 含义 |
|---|---|
| 三维高斯函数 | |
| 协方差矩阵的参数化分解 | |
| 球谐颜色(3阶SH) | |
| 前向 alpha 混合 | |
| 第 i 个高斯处的透射率 | |
| 训练损失(λ=0.2) |
参考文献
- Kerbl, B., Kopanas, G., Leimkühler, T., & Drettakis, G. (2023). 3D Gaussian Splatting for Real-Time Radiance Field Rendering. ACM Transactions on Graphics (SIGGRAPH 2023), 42(4). DOI: 10.1145/3592433
- Mildenhall, B., Srinivasan, P. P., Tancik, M., Barron, J. T., Ramamoorthi, R., & Ng, R. (2020). NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. ECCV 2020. arXiv: 2003.08934
- Müller, T., Evans, A., Schied, C., & Keller, A. (2022). Instant Neural Graphics Primitives with a Multiresolution Hash Encoding. ACM Transactions on Graphics (SIGGRAPH 2022), 41(4). arXiv: 2201.05989
- Yu, Z., Chen, A., Huang, B., Sattler, T., & Geiger, A. (2024). Mip-Splatting: Alias-free 3D Gaussian Splatting. CVPR 2024. arXiv: 2311.16493
- Guédon, A., & Lepetit, V. (2024). SuGaR: Surface-Aligned Gaussian Splatting for Efficient 3D Mesh Reconstruction and High-Quality Mesh Rendering. CVPR 2024. arXiv: 2311.12775
- Huang, B., Yu, Z., Chen, A., Geiger, A., & Gao, S. (2024). 2D Gaussian Splatting for Geometrically Accurate Radiance Fields. SIGGRAPH 2024. arXiv: 2403.17888
- Wu, G., Yi, T., Fang, J., Xie, L., Zhang, X., Wei, W., Liu, W., Tian, Q., & Wang, X. (2024). 4D Gaussian Splatting for Real-Time Dynamic Scene Rendering. CVPR 2024. arXiv: 2310.08528
- Fan, Z., Wang, K., Wen, K., Zhu, Z., Xu, D., & Wang, Z. (2024). LightGaussian: Unbounded 3D Gaussian Compression with 15x Reduction and 200+ FPS. arXiv: 2311.17245
本文写作时所有 arXiv ID 均在 arxiv.org 可查。性能数据来自原论文 Table 2,测试平台 RTX 4090。