L1 中我们学习了 NeRF——它用一个 MLP 神经网络隐式地编码整个场景,每渲染一个像素都要沿光线采样上百个点、查询网络数百次。这种设计的代价是:渲染极慢(单帧可能需要数十秒),远达不到实时交互的要求。
2023 年,Kerbl 等人提出的 3D Gaussian Splatting(3DGS) 彻底改变了这一局面。它用显式的 3D 高斯点云替代隐式 MLP,通过 GPU 光栅化在 1080p 分辨率下实现实时渲染(>100 FPS)。本章将拆解它的核心思想——为什么"显式"可以比"隐式"快 100 倍。
本课涉及多个新术语。如需随时查阅定义,请打开 L2 词汇表(可打印,适合边学边查)。
想象你要用颜料在纸上画一个三维场景。NeRF 的做法是:每画一个像素,都问一次"向导"(MLP)"这里应该是什么颜色",向导需要思考很久才能回答。而 3DGS 的做法是:直接在三维空间中放置成千上万个半透明的彩色"颜料 blob",然后用相机把这些 blob "拍"到屏幕上。
每个"blob"是一个3D 高斯(3D Gaussian)——也就是一个三维的椭圆体,中心最浓、边缘渐淡。它有四个可学习的属性:
NeRF 的瓶颈在于每个采样点都要过一次 MLP。3DGS 的巧妙之处在于:把场景表示为一组静态的基元(高斯),渲染时只需要把它们投影到屏幕并按深度排序,然后做 alpha 混合。这本质上是一个几何光栅化问题——GPU 最擅长的事。
一个 3D 高斯由均值(位置)和协方差矩阵定义。直观上,协方差矩阵控制高斯的形状:
这种灵活性至关重要:场景中的平坦墙面需要"扁平"的高斯来覆盖大面积,而细小的树枝需要"细长"的高斯来贴合形状。协方差矩阵让少量高斯就能高效表达复杂几何。
Splatting(抛雪球/泼溅)是 3DGS 渲染的核心步骤,名字非常形象:想象把一坨颜料从三维空间中"拍"到二维屏幕上,形成一个椭圆的印迹。这个过程包含三步:
投影后的 2D 高斯可以用解析式直接计算每个像素被"覆盖"的程度——不需要像 NeRF 那样沿光线采样。这就是 3DGS 能实时渲染的根本原因:每个像素的值是少量 2D 高斯的加权求和,而不是上百次 MLP 推理后的积分。
3D 高斯投影到 2D 时,协方差矩阵的变换有一个优雅的解析解:2D 协方差 = J · 3D 协方差 · JT,其中 J 是投影变换的雅可比矩阵。这意味着投影后的 2D 椭圆形状可以直接计算,无需数值近似。
3DGS 的高斯参数(位置、协方差、颜色、不透明度)都是可学习的——通过比较渲染图像与真实照片的差异,用反向传播调整这些参数。但这里有一个工程难题:光栅化过程涉及深度排序,而排序操作是不可微分的。
3DGS 的解决方案是基于瓦片(Tile-Based)的可微分光栅化:
最后一步至关重要:通过记录每条光线路径上高斯的可见度(transmittance),反向传播时就能精确计算每个高斯参数对像素颜色的影响。这使得整个渲染流程完全可微分。
可微分光栅化就像是一位记账精细的画家:他每次画一笔都记下这一笔对最终画面的贡献比例。当导师说"这里颜色偏红了",画家能精确地知道哪些笔触需要调整红色分量、调整多少——而不是盲目地重画整幅画。
3DGS 从 COLMAP 输出的稀疏点云初始化(通常只有几千个点)。这些点太少,无法表达复杂场景。训练过程中,3DGS 通过自适应密度控制动态调整高斯数量:
| 操作 | 触发条件 | 效果 |
|---|---|---|
| 致密化(Densification) | 梯度较大(该区域视图间不一致) | 高斯分裂为两个较小的高斯,或克隆一个副本沿梯度方向移动 |
| 剪枝(Pruning) | 不透明度 α 过低 | 删除"几乎透明"的高斯,减少冗余 |
致密化和剪枝交替进行,最终得到一个"恰到好处"的高斯分布:复杂区域有密集的小高斯捕捉细节,平坦区域用少量大高斯覆盖。最终的高斯数量通常在数十万到数百万之间。
真实世界的表面颜色会随观察角度变化(如金属反光、车漆的珍珠效果)。NeRF 通过把方向 (θ, φ) 输入 MLP 来建模这种视角相关性。3DGS 没有 MLP,它如何做到这一点?
答案是球谐函数(Spherical Harmonics, SH)。每个高斯存储一组 SH 系数,渲染时根据观察方向计算对应的 RGB 值。球谐函数是定义在球面上的正交基函数,类似于傅里叶变换在圆周上的推广。
球谐函数可以理解为"方向的调色板":每个高斯不再只有一个固定的 RGB 颜色,而是有一个"方向-颜色"的映射表。当相机从不同角度观察时,查表得到不同的颜色。SH 的阶数越高,能表达的视角变化越复杂(但也需要更多的系数存储)。3DGS 通常使用 3 阶 SH(共 48 个系数),已经足以表达大多数场景的视角变化。
| 维度 | NeRF(L1) | 3D Gaussian Splatting |
|---|---|---|
| 表示方式 | 隐式:MLP 权重 | 显式:3D 高斯点云 |
| 渲染核心 | 体积渲染(沿光线积分 MLP 输出) | 光栅化(投影 + Alpha 混合) |
| 渲染速度 | 秒级/帧(无法实时) | >100 FPS @ 1080p(实时) |
| 训练速度 | 原始 NeRF:小时到数小时;现代变体(如 nerfacto):分钟级(10-30 min) | 分钟级(通常 5-20 分钟) |
| 初始化 | 随机权重 | COLMAP 稀疏点云 |
| 视角建模 | MLP 输入方向 | 球谐函数 SH |
| 内存占用 | 小(仅存储 MLP 权重,~10MB) | 大(存储所有高斯参数,~100MB-1GB) |
| 编辑性 | 差(修改 MLP 权重不直观) | 好(可直接操作高斯位置/形状) |
如果你想更深入地理解 3DGS 的设计动机和工程实现,推荐以下资源:
下一节课(L3)将介绍 NeRF / 3DGS 与生成模型的关联——VAE、Diffusion 模型如何驱动 3D 内容生成。你会看到 DreamFusion 等里程碑工作如何将 2D 图像生成能力"升级"到 3D 空间,以及这背后的核心思想(Score Distillation Sampling)。
如有任何概念不清楚,随时向我提问。NeRF 与 3DGS 的对比是技术选型的核心基础,确保理解两种方法的 trade-off 后再进入下一课。