模块一 · 核心原理 预计阅读 15 分钟

Gaussian Splatting 原理:显式点云与光栅化

L1 中我们学习了 NeRF——它用一个 MLP 神经网络隐式地编码整个场景,每渲染一个像素都要沿光线采样上百个点、查询网络数百次。这种设计的代价是:渲染极慢(单帧可能需要数十秒),远达不到实时交互的要求。

2023 年,Kerbl 等人提出的 3D Gaussian Splatting(3DGS) 彻底改变了这一局面。它用显式的 3D 高斯点云替代隐式 MLP,通过 GPU 光栅化在 1080p 分辨率下实现实时渲染(>100 FPS)。本章将拆解它的核心思想——为什么"显式"可以比"隐式"快 100 倍。

术语速查

本课涉及多个新术语。如需随时查阅定义,请打开 L2 词汇表(可打印,适合边学边查)。

1. 核心思想:用高斯 blob 替代神经网络

想象你要用颜料在纸上画一个三维场景。NeRF 的做法是:每画一个像素,都问一次"向导"(MLP)"这里应该是什么颜色",向导需要思考很久才能回答。而 3DGS 的做法是:直接在三维空间中放置成千上万个半透明的彩色"颜料 blob",然后用相机把这些 blob "拍"到屏幕上。

每个"blob"是一个3D 高斯(3D Gaussian)——也就是一个三维的椭圆体,中心最浓、边缘渐淡。它有四个可学习的属性:

NeRF(隐式) 相机 MLP MLP 每像素数百次 MLP 前向 渲染慢,无法实时 3DGS(显式) 相机 每个高斯直接投影到屏幕 GPU 光栅化,实时渲染 vs
NeRF(左)与 3DGS(右)的核心差异。NeRF 每像素需要沿光线采样并查询 MLP 数百次;3DGS 直接将 3D 高斯投影到屏幕并光栅化,无需神经网络推理。
关键洞察

NeRF 的瓶颈在于每个采样点都要过一次 MLP。3DGS 的巧妙之处在于:把场景表示为一组静态的基元(高斯),渲染时只需要把它们投影到屏幕并按深度排序,然后做 alpha 混合。这本质上是一个几何光栅化问题——GPU 最擅长的事。

2. 3D 高斯:可塑的彩色颜料 blob

一个 3D 高斯由均值(位置)和协方差矩阵定义。直观上,协方差矩阵控制高斯的形状

这种灵活性至关重要:场景中的平坦墙面需要"扁平"的高斯来覆盖大面积,而细小的树枝需要"细长"的高斯来贴合形状。协方差矩阵让少量高斯就能高效表达复杂几何。

球形高斯 各向同性,适合零散细节 扁平高斯 适合墙面、地面等平面 细长高斯 适合树枝、电线等细结构 特征值: 1, 1, 1 特征值: 3, 1, 0.3 特征值: 0.3, 1, 4
通过调整协方差矩阵的特征值,单个 3D 高斯可以变形为球体、扁平盘或细长条,从而贴合不同几何形状。

3. Splatting:把 3D 高斯拍扁到屏幕上

Splatting(抛雪球/泼溅)是 3DGS 渲染的核心步骤,名字非常形象:想象把一坨颜料从三维空间中"拍"到二维屏幕上,形成一个椭圆的印迹。这个过程包含三步:

  1. 投影(Projection):将 3D 高斯按相机参数投影到图像平面,得到一个 2D 高斯椭圆
  2. 排序(Sorting):按深度对所有投影后的高斯排序(从前到后)
  3. Alpha 混合(Alpha Blending):按深度顺序将每个高斯的颜色乘以其透明度,累加到像素上
1. 3D 高斯场景 相机 2. 投影到屏幕 2D 椭圆(投影后) 3. Alpha 混合 按深度排序后累加
3DGS 渲染的三步流水线:3D 高斯场景 → 投影为 2D 椭圆 → 按深度 Alpha 混合得到最终图像。

投影后的 2D 高斯可以用解析式直接计算每个像素被"覆盖"的程度——不需要像 NeRF 那样沿光线采样。这就是 3DGS 能实时渲染的根本原因:每个像素的值是少量 2D 高斯的加权求和,而不是上百次 MLP 推理后的积分

技术细节

3D 高斯投影到 2D 时,协方差矩阵的变换有一个优雅的解析解:2D 协方差 = J · 3D 协方差 · JT,其中 J 是投影变换的雅可比矩阵。这意味着投影后的 2D 椭圆形状可以直接计算,无需数值近似。

4. 可微分光栅化:训练的秘密武器

3DGS 的高斯参数(位置、协方差、颜色、不透明度)都是可学习的——通过比较渲染图像与真实照片的差异,用反向传播调整这些参数。但这里有一个工程难题:光栅化过程涉及深度排序,而排序操作是不可微分的。

3DGS 的解决方案是基于瓦片(Tile-Based)的可微分光栅化

  1. 将屏幕划分为 16×16 像素的瓦片(Tile)
  2. 找出与每个瓦片相交的高斯(预筛选,避免处理无关高斯)
  3. 对每个瓦片独立进行深度排序和 Alpha 混合
  4. 在混合时记录每个像素"看到了"哪些高斯,以及各自的贡献权重

最后一步至关重要:通过记录每条光线路径上高斯的可见度(transmittance),反向传播时就能精确计算每个高斯参数对像素颜色的影响。这使得整个渲染流程完全可微分。

类比

可微分光栅化就像是一位记账精细的画家:他每次画一笔都记下这一笔对最终画面的贡献比例。当导师说"这里颜色偏红了",画家能精确地知道哪些笔触需要调整红色分量、调整多少——而不是盲目地重画整幅画。

5. 自适应密度控制:自动增删高斯

3DGS 从 COLMAP 输出的稀疏点云初始化(通常只有几千个点)。这些点太少,无法表达复杂场景。训练过程中,3DGS 通过自适应密度控制动态调整高斯数量:

操作 触发条件 效果
致密化(Densification) 梯度较大(该区域视图间不一致) 高斯分裂为两个较小的高斯,或克隆一个副本沿梯度方向移动
剪枝(Pruning) 不透明度 α 过低 删除"几乎透明"的高斯,减少冗余
致密化前 单个高斯覆盖粗糙区域 分裂 致密化后 两个较小高斯表达更多细节
致密化操作:当某个高斯对应的梯度较大(说明该区域重建质量差),将它分裂为两个较小的高斯,提升局部表达能力。

致密化和剪枝交替进行,最终得到一个"恰到好处"的高斯分布:复杂区域有密集的小高斯捕捉细节,平坦区域用少量大高斯覆盖。最终的高斯数量通常在数十万到数百万之间。

6. 颜色建模:球谐函数捕捉视角变化

真实世界的表面颜色会随观察角度变化(如金属反光、车漆的珍珠效果)。NeRF 通过把方向 (θ, φ) 输入 MLP 来建模这种视角相关性。3DGS 没有 MLP,它如何做到这一点?

答案是球谐函数(Spherical Harmonics, SH)。每个高斯存储一组 SH 系数,渲染时根据观察方向计算对应的 RGB 值。球谐函数是定义在球面上的正交基函数,类似于傅里叶变换在圆周上的推广。

直观理解

球谐函数可以理解为"方向的调色板":每个高斯不再只有一个固定的 RGB 颜色,而是有一个"方向-颜色"的映射表。当相机从不同角度观察时,查表得到不同的颜色。SH 的阶数越高,能表达的视角变化越复杂(但也需要更多的系数存储)。3DGS 通常使用 3 阶 SH(共 48 个系数),已经足以表达大多数场景的视角变化。

7. 本节核心对比:NeRF vs 3DGS

维度 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 权重不直观) 好(可直接操作高斯位置/形状)

8. 快速检验

Q1. 3DGS 能实现实时渲染的核心原因是什么?
Q2. 在 3DGS 中,协方差矩阵的作用是?
Q3. 3DGS 训练过程中的"致密化"操作在什么情况下触发?

9. 本节小结

10. 延伸阅读

如果你想更深入地理解 3DGS 的设计动机和工程实现,推荐以下资源:

下一步

下一节课(L3)将介绍 NeRF / 3DGS 与生成模型的关联——VAE、Diffusion 模型如何驱动 3D 内容生成。你会看到 DreamFusion 等里程碑工作如何将 2D 图像生成能力"升级"到 3D 空间,以及这背后的核心思想(Score Distillation Sampling)。

如有任何概念不清楚,随时向我提问。NeRF 与 3DGS 的对比是技术选型的核心基础,确保理解两种方法的 trade-off 后再进入下一课。