A pedagogical survey · 2023.07 — 2026.05
大规模 3D Gaussian Splatting
把一整座城市装进显存、训练得完、还能 60 FPS 实时漫游 — 这是过去三年
所有 Large-Scale 3DGS 工作共同想解决的痛。
本文从 Kerbl 等人 2023 年的原始论文一路讲到 2026 年最新前沿,
尽量讲清每篇文章 一句话的关键想法 与
它跟前一代的区别。
预设读者:会基本的 NeRF、SDF、机器学习、微积分、线性代数。
不会 3DGS 也没关系——我们从头讲。
约 40 篇论文 · 4 个交互演示 · 多段可读伪代码 · 最后更新 2026-05-19
§1什么是 3D Gaussian Splatting?
2023 年 7 月,Inria 的 Kerbl, Kopanas, Leimkühler, Drettakis 在 SIGGRAPH 发表
了 3D Gaussian Splatting for Real-Time Radiance Field Rendering。
它用了一个让人觉得"怎么没人早点试"的简单想法:
关键想法 · 一句话
把场景表示成几百万个三维高斯椭球,每个椭球记下它的位置、形
状(协方差)、不透明度、颜色(用球谐函数表示视角依赖);渲染时把每个椭球
溅射 (splat) 到屏幕上做 alpha 合成。
对比 NeRF:NeRF 是隐式的——一个 MLP 接受 $(x, y, z, \theta, \phi)$
返回颜色和密度,渲染时沿射线采 64–256 次。3DGS 是显式的——
场景就是一堆点状的原语 (primitive),每个原语自己说明自己长什么样,渲染时
把每个原语一次性映射到屏幕。这两种方式数学上算的是同一个积分
(体渲染方程的离散化),但显式表示让 GPU 能做光栅化式的并行,而不是逐像素
逐采样点串行 MLP 查询。
一个 3D Gaussian 里到底存了什么
| 属性 | 含义 | 大小 |
| 位置 $\boldsymbol{\mu} \in \mathbb{R}^3$ | 椭球中心 | 3 floats |
| 四元数 $q$ | 旋转(保证协方差对称正定) | 4 floats |
| 缩放 $s$ | 三个主轴的长度 | 3 floats |
| 不透明度 $o \in [0,1]$ | 椭球中心处的不透明度 | 1 float |
| 球谐系数 (degree 3) | 视角依赖颜色,$16$ 个基 $\times$ 3 通道 | 48 floats |
合计 59 个 float,padding 后约 256 字节。这条 ~256 B / Gaussian
的经验值后面会反复出现:一个城市 reconstruct 出几千万个 Gaussian,
显存就直接爆。
协方差不是直接学一个 $3\times 3$ 矩阵——那样很容易学出非正定的。而是分解:
$$ \Sigma = R(q) \, S \, S^\top R(q)^\top, \quad S = \mathrm{diag}(s_x, s_y, s_z) $$
$R(q)$ 是单位四元数对应的旋转矩阵。这样优化的永远是 $q$ 和 $s$,
得到的 $\Sigma$ 结构上就一定是对称正定的。
3DGS 的图像形成模型,本质上跟 NeRF 一模一样——
alpha 合成的体渲染方程:
$$ C(\mathbf{x}) = \sum_{i \in \mathcal{N}} c_i \, \alpha_i \prod_{j=1}^{i-1} (1 - \alpha_j) $$
$\mathcal{N}$ 是按深度从近到远排好序的、覆盖到当前像素的 Gaussian 集合,
$c_i$ 是 Gaussian $i$ 的视角相关颜色,$\alpha_i$ 是这个像素处
Gaussian $i$ 的有效不透明度:
$$ \alpha_i = o_i \cdot \exp\!\left( -\tfrac{1}{2} (\mathbf{x} - \boldsymbol{\mu}_i')^\top {\Sigma_i'}^{-1} (\mathbf{x} - \boldsymbol{\mu}_i') \right) $$
$\boldsymbol{\mu}_i'$ 是 3D 中心投影到 2D 像素坐标后的位置,
$\Sigma_i'$ 是 3D 协方差在 2D 上的"投影"协方差。
关键问题:3D 椭球投影到 2D 之后,新的 2D 协方差是什么?
这就是 EWA splatting (Zwicker et al. 2001):
$$ \Sigma' = J \, W \, \Sigma \, W^\top J^\top $$
其中 $W$ 是世界到相机的旋转,$J$ 是透视投影在 $\boldsymbol{\mu}$ 附近的
线性化雅可比。直观说:透视投影是非线性的,但 Gaussian 的
$3\sigma$ 范围通常很小,局部线性化就够准了。$J W \Sigma W^\top J^\top$
得到一个 $3\times 3$ 矩阵,丢掉第三行第三列,剩下 $2\times 2$ 就是屏幕上的椭圆。
直觉
把一个橡皮球往墙上拍——球碰到墙的瞬间会被压扁成一个椭圆。EWA 做的事一
模一样:相机平面就是那堵"墙",$J W \Sigma W^\top J^\top$ 就是描述那个被
压扁的椭圆有多宽多扁。
核心前向:一个 Gaussian、一个像素
这是 3DGS 算法在教学上最少的代码——不为性能,只为讲清楚:
# One Gaussian g, one pixel x, given camera (W, K, t) and view direction d.
def render_one_gaussian_one_pixel(g, x, W, K, t, d, T_prev, C_prev):
# 1. Project the 3D mean to image space.
mu_cam = W @ g.mu + t # (3,)
mu_img = (K @ mu_cam)[:2] / mu_cam[2] # (2,) perspective divide
# 2. Build the 3D covariance from (q, s), then project via EWA.
R = quat_to_rotmat(g.q) # (3, 3)
S = torch.diag(g.s) # (3, 3)
Sigma3D = R @ S @ S.T @ R.T # PSD by construction
J = perspective_jacobian(mu_cam, K) # (2, 3) linearization of perspective
Sigma2D = J @ W[:3,:3] @ Sigma3D @ W[:3,:3].T @ J.T
# 3. Evaluate the 2D Gaussian at this pixel.
delta = x - mu_img
power = -0.5 * delta @ torch.inverse(Sigma2D) @ delta
alpha = g.opacity * torch.exp(power) # effective opacity
# 4. View-dependent color, then front-to-back alpha compositing.
c = eval_sh(g.sh_coeffs, d) # (3,)
C_new = C_prev + T_prev * alpha * c
T_new = T_prev * (1.0 - alpha)
return C_new, T_new
实际实现做了三层关键的优化:(1) 屏幕分成 $16\times 16$ 的 tile,
每个 Gaussian 只参与它$3\sigma$ 椭圆能碰到的 tile;
(2) 全图一次 GPU radix sort,
排序 key = `tile_id | depth`,所以每个 tile 内自然就是从近到远了;
(3) 每个 tile 把它的 Gaussian 列表加载到 shared memory,
线程组内大家共用,访存只读一次。
§3为什么 3DGS 比 NeRF 快两个数量级
| NeRF | 3DGS |
| 每像素工作量 |
64–256 次 MLP 查询 |
访问 ~10–100 个 Gaussian 的列表项 |
| 瓶颈 |
compute (MLP forward) |
memory bandwidth (排序 + 合成) |
| 并行粒度 |
per-ray, per-sample |
per-tile(千百个像素共享一份排好序的列表) |
| 典型 $800\times 800$ PSNR / FPS |
~30 / 0.06 |
~30 / 100+ |
把这句话刻在脑子里:NeRF 用计算换显存(隐式 MLP 很小),
3DGS 用显存换计算(几百万个原语很大)。
这一权衡决定了——大场景下 3DGS 的痛全在显存那一侧。
§4为什么 3DGS 一到大场景就崩
接下来这四条痛,是第二、三、四、五、六、七部所有论文都在
尝试缓解的。请把它们记下来。
痛点 (a):显存爆炸
一个市区 reconstruct 出来轻轻松松上千万个 Gaussian,
$10^7 \times 256\text{B} = 2.5\text{GB}$ 只是参数;
加上梯度、Adam 的一阶二阶矩、tile buffer,乘 4 就是 10 GB+。
一个完整城市需要的 Gaussian 数会到 $10^8$ – $10^9$,单卡彻底装不下。
痛点 (b):稠密化失控
原版 3DGS 用一个简单启发式:累计屏幕空间梯度超过阈值就 split / clone。
这个阈值是为单物体调出来的;一到城市级,
地面纹理和树叶会触发雪崩式的克隆,
Gaussian 数量超线性增长,
训练还没收敛显存就 OOM。
痛点 (c):外观漂移
一座城市的 5000 张照片可能跨越几小时、几天、几季节、几个相机、
不同曝光。单个 Gaussian 的 SH 系数无法同时拟合
"晴天上午的墙"和"阴天傍晚的同一面墙",
优化器只能取平均,出来一片"奶油色雾霾"。
痛点 (d):没有 LoD
一个像素如果对应 2 km 外的摩天楼楼顶,
传统 3DGS 还是要把那块楼顶里上千个亚像素小高斯
全部排序、全部合成——成本和近景一样。
Mesh 渲染早就有 mipmap / LOD 了,
3DGS 出生时却没有这一层。
§5Scaffold-GS · 锚点结构
Scaffold-GS
— Structured 3D Gaussians for View-Adaptive Rendering
原版 3DGS 让每个 Gaussian 自由漂浮,产生大量冗余原语,且对视角与光照变化
脆弱——这在大场景里是致命的。
关键想法:把场景体素化成稀疏的锚点 (anchor)
网格,每个锚点持有一组"待生成"的 Gaussian。渲染时,
一个小 MLP 根据视角方向、视距,
动态预测这些 Gaussian 的位置偏移、不透明度、协方差、颜色。
锚点本身在训练中根据"贡献度"加密 / 修剪。
Scaffold-GS 是几乎所有后续大场景工作的结构性脚手架:
Octree-GS、LoG、CityGS-X 都在它的"锚点 + 解码器"模板上做拓展。
§6Mip-Splatting · 把锯齿干掉
Mip-Splatting
— Alias-free 3D Gaussian Splatting
缩放或换焦距时,原版 3DGS 会出现严重锯齿——飞越城市时镜头从特写拉到全景,
画面会"沸腾"。
关键想法:参照经典 mipmap,给每个 Gaussian 加两个滤波器:
-
3D 平滑滤波 (smoothing filter):训练时根据所有训练
视角的采样率,给每个 Gaussian 的 3D 协方差加一个最小尺寸下限,
防止它在 3D 里"比一个采样点还细"。
-
2D Mip 滤波:测试时根据新视角的像素覆盖率,
把 2D 协方差再做一次盒滤波,效果上等于"在不同 mip 层上取样"。
数学上是 EWA splatting 论文里被遗忘了二十年的另一半(pre-filter)
被翻出来重新拼回来。在大场景里这块尤其重要——
任何 LoD 工作都必须先解决锯齿,否则切层时会看见跳变。
§7AbsGS / Pixel-GS · 把稠密化修对
AbsGS
— Recovering Fine Details for 3D Gaussian Splatting
原版稠密化用的是带符号的视角空间梯度——一个 Gaussian
被左右两次视角推向相反方向,梯度会相互抵消,
本该被切分的大模糊 Gaussian 反而留下了。这就是论文说的 gradient collision。
关键想法:改用同向 (absolute / homodirectional)
的梯度作为切分阈值。这一字之差,让大场景里的"奶油色雾霾"消失了一大半。
Pixel-GS
— Pixel-aware Gradient Densification
关键想法:在累加每个视角对稠密化梯度的贡献时,
按该视角下 Gaussian 投影占的像素面积加权。
覆盖面积大的视角说话声音大、覆盖面积小的小声——
这刚好解决了航拍 / 城市场景里 SfM 点云稀疏导致的"针状 / 块状伪影"。
把 AbsGS 和 Pixel-GS 一起记住:它们是所有大场景论文默认开启
的"稠密化补丁",地位类似 ResNet 里的 BN。
§82DGS · 让 Gaussian 贴在表面上
2DGS
— 2D Gaussian Splatting for Geometrically Accurate Radiance Fields
3D 椭球是"体",不是"面":从不同视角看同一面墙,3D Gaussian 给出的深度
会跳变(因为它们是云状的)。城市里的地面、屋顶、玻璃面都是明确
的面,体积 Gaussian 重建它们既浪费又不精确。
关键想法:把 3D 椭球换成 2D 椭圆盘 (planar disk),
每个 disk 有自己的法向。渲染时不再是 EWA splatting,
而是 ray-disk 求交。直接出 sharper 的几何 + 多视角一致的深度。
后面 CityGaussianV2 把基元从 3DGS 换到 2DGS,
城市表面立刻干净一截——这是 2DGS 在大场景里第一次发力。
§9LightGaussian · 压缩 15×
LightGaussian
— Unbounded 3D Gaussian Compression with 15× Reduction and 200+ FPS
三件事一起做:
- 剪枝:算每个 Gaussian 的"全局重要度" (global significance),
砍掉对最终图像贡献小的。
- SH 蒸馏:用增广视角监督把 degree-3 的 SH 蒸到 degree-2 / 1,
系数数 48 → 27 / 12。
- 向量量化:剩下的属性用 codebook 编码。
它本身不是为大场景设计的,但它就是大场景的部署武器——
Hierarchical-3DGS、CityGaussian 出来的几十 GB 模型,配 LightGaussian 之后
才进得了浏览器、进得了手机。
§10VastGaussian · 把城市切成块,每块单独训
VastGaussian
— Vast 3D Gaussians for Large Scene Reconstruction
单卡训不下 / appearance 漂移。
关键想法:第一篇真正意义上的城市级 3DGS。
它做了两件事,从此成为整个分块流派的模板:
-
Progressive cell-based partition + visibility-based 分配:
把场景在 XY 平面切成网格 cell。每个 cell 训自己的 Gaussian 集合。
关键的"airspace-aware":一张照片即使主点不落在 cell 内,
只要它的视锥看进 cell 上方,就分配给那个 cell。
(想象一架无人机在 cell 边缘上空拍 cell 中间——它必须帮 cell 中间训练。)
-
Decoupled appearance modeling:每张训练图像挂一个
per-image embedding,过一个轻量 CNN 把当下光照 / 曝光 / 白平衡解耦
到一个 modulation 上。训练时它修正颜色误差,测试时直接丢掉,
留下的 Gaussian 是"平均光照"版的干净表示。
VastGaussian 是后续所有分块工作(DOGS, CityGaussian, BlockGaussian,
LoBE-GS …)的祖师爷。如果你只读一篇分块论文,就读这篇。
§11CityGaussian · 给城市加 LoD 金字塔
CityGaussian
— Real-time High-quality Large-Scale Scene Rendering with Gaussians
VastGaussian 训得动了,但渲染城市的时候还是慢——
没有 LoD,远处的小细节也得整本字典翻一遍。
关键想法:训练阶段先训一个粗粒度的全局先验
(低分辨率 Gaussian 集合),然后用它指导每个 block 的精细化训练;
渲染阶段每个 block 自带一个压缩的 LoD 金字塔,
根据视角距离即时挑层。结果:实时帧率穿越城市,质量不掉。
VastGaussian = "训得下"。CityGaussian = "训得下 + 跑得起"。
第一次让"实时城市漫游"和"高保真 3DGS"在同一个工作里出现。
§12DOGS · 用 ADMM 让各块达成共识
DOGS
— Distributed-Oriented Gaussian Splatting via Gaussian Consensus
VastGaussian 各 block 独立训练完拼回去时——块的接缝处
色彩、几何不一致,肉眼可见。
关键想法:借用经典分布式优化里的
ADMM (Alternating Direction Method of Multipliers)。
每个 block 是一个 worker,对自己持有的 Gaussian 做局部更新;
一个 master 持有"全局共识"Gaussian;每隔几步,
worker 的 Gaussian 和 master 共识做 ADMM 一步更新,
乘上拉格朗日乘子收敛到一致。
数学上看,DOGS 把原本的训练目标
$\min \sum_k f_k(\theta_k)$ 重写成有共识约束的形式
$\min \sum_k f_k(\theta_k)\ \text{s.t.}\ \theta_k = z$,
然后用增广拉格朗日量
$$ \mathcal{L}_\rho = \sum_k f_k(\theta_k) + \lambda_k^\top (\theta_k - z) + \tfrac{\rho}{2} \|\theta_k - z\|^2 $$
交替优化 $\theta_k$、$z$、$\lambda_k$。
这给了块并行训练第一个收敛性保证。
VastGaussian: 切块 → 各训各的 → 直接拼。DOGS: 切块 → 各训各的
同时定期跟 master 对齐 → 拼回去就是一致的。提速 ~6×。
§13Grendel · 多卡训练系统
Grendel
— On Scaling Up 3D Gaussian Splatting Training
关键想法:跟 DOGS / VastGaussian 是正交的方向
——不切场景,而是把训练系统本身改造成多 GPU 协作的:
Gaussian-wise 切分(每张卡管一部分 Gaussian)+ pixel-wise 切分
(每张卡渲染一部分像素),用稀疏 all-to-all 通信交换数据;
动态负载均衡 + 多视角 batch + sqrt-batch LR rule。
VastGaussian 用"空间切",Grendel 用"系统切"。一个分块、一个分卡——
这是大场景训练的两个正交轴。
§14Momentum-GS · 自蒸馏让各块说同一种话
Momentum-GS
— Momentum Gaussian Self-Distillation for High-Quality Large Scene Reconstruction
DOGS 解决了块间一致性,但仍把块数等于 GPU 数当成默认假设
——块多了 GPU 不够;块少了每块太大。
关键想法:借用 MoCo / BYOL 那一套
动量更新的教师:一个由所有 student blocks 的指数滑动平均
维护的"teacher Gaussian decoder",在训练中持续地把
全局信号蒸馏给每个块的 student decoder。
加上"按重建准确度加权各块",让块数和 GPU 数彻底解耦。
DOGS 用 ADMM 写硬约束达成共识;Momentum-GS 用自蒸馏做软约束达成共识。
硬约束保证收敛,软约束更工程友好。
§15Horizon-GS · 同时吃下航拍和街景
Horizon-GS
— Unified 3D Gaussian Splatting for Large-Scale Aerial-to-Ground Scenes
无人机俯拍 + 街上手持拍同一个城区,
两套照片在尺度、视角、覆盖密度上差异巨大。
分开训得两个不一致的 3DGS,合起来训直接发散。
关键想法:粗→精两阶段——先用航拍图建立空间骨架,
再喂入街景图精细化建筑立面 / 行人尺度细节,
通过精心设计的 anchor sharing + 渐进式分辨率提升让两个视图域在同一个
模型里收敛。配套发布了"aerial-to-ground"数据集。
§16BlockGaussian · 内容感知的自适应分块
BlockGaussian
— Efficient Large-Scale Scene Novel View Synthesis via Adaptive Block-Based Gaussian Splatting
固定网格分块在空旷区域浪费容量,
在密集区域又训不下。
关键想法:根据 SfM 点密度让 block 大小自适应
(密集处小 block、空旷处大 block),
再加上 visibility-aware per-block 优化。
24 GB 单卡上能跑、训练 5× 加速。
§17CityGaussianV2 · 把基元换成 2DGS
CityGaussianV2
— Efficient and Geometrically Accurate Reconstruction for Large-Scale Scenes
关键想法:把 CityGaussian 的基元从 3DGS 换成 2DGS,
并加入 decomposed-gradient densification + depth regression。
训练时间 -25 %、显存 -50 %,且道路和建筑表面更锐利。
把 §11 + §8 的优势拼到一起。
§18LoBE-GS · 看谁的 Gaussian 多,谁来做工
LoBE-GS
— Load-Balanced and Efficient 3D Gaussian Splatting for Large-Scale Scene Reconstruction
分块训练最大的隐藏问题:块大小不均匀。
一个市中心 block 200 万 Gaussian,一个郊区 block 20 万——
GPU wall-time 是被市中心那块定死的。
关键想法:用可见 Gaussian 数而不是空间面积
作为负载代理;用深度感知分块 + 优化驱动的块大小调整把负载抹平。
preprocess 从几小时降到几分钟,端到端 ~2× 加速。
§19CityGS-X · 干脆不要 merge 这一步
CityGS-X
— Scalable Architecture with Parallelized Hybrid Hierarchical 3D Representation (PH$^2$-3D)
"切→各自训→拼"流程里,那个 拼 步骤本身就是个噩梦:边界 Gaussian
要重新对齐、损失曲线得重新平滑、整体得再 fine-tune。
关键想法:直接把全场景表达成一个
分层稀疏 voxel + Gaussian 混合表达,
多 GPU 在同一份共享层级表达上并行训练 —— 跳过 merge。
5000+ 张图的场景 4× RTX 4090 上 5 小时就训完。
跟 VastGaussian 一路的"切分思路"分了岔——CityGS-X 论证:
与其想办法拼,不如根本别切。
§20Hierarchical-3DGS · LoD 终于来了
H-3DGS
— A Hierarchical 3D Gaussian Representation for Real-Time Rendering of Very Large Datasets
原班 Inria 团队回来正面回答:几万张照片的多公里场景,怎么训、怎么渲。
关键想法:先把场景切成 chunk,每个 chunk 单独训出一片 3DGS,
然后逐对合并 (merge as you go):
两片邻接 Gaussian 集合用一个轻量准则合并成更粗的一层;
上层 Gaussian 接管远距离视角的渲染,下层只在近距离激活。
渲染时根据相机距离做平滑过渡 (smooth LoD blending)。
第一次把"金字塔 LoD"这件 mesh / texture 里的老传统系统地
带进 3DGS。VastGaussian 让大场景"训得下",H-3DGS 让大场景"渲得快又好"。
Demo 4 · Hierarchical / Octree LoD selector
激活原语数 =
四层金字塔:Level 0 = 1 个粗 Gaussian,Level 3 = 64 个细 Gaussian。
滑动相机距离时,系统挑选"投影到屏幕上仍 $\ge 14$ 像素"的最细一层来渲染;
其他层灰色淡出。这就是 H-3DGS、Octree-GS、LoG 共享的核心机制。
§21Octree-GS · 把 Scaffold-GS 装进八叉树
Octree-GS / Octree-AnyGS
— Towards Consistent Real-time Rendering with LOD-Structured 3D Gaussians
关键想法:把 Scaffold-GS 的锚点组织成一棵
八叉树。每一层节点持有一组锚点,
上层节点的锚点解码出"粗 Gaussian",下层解码出"细 Gaussian"。
渲染时根据每根光线的视距挑选合适的树层,
实现 LoD 同时保持 Scaffold-GS 那套"MLP 即时生成 Gaussian"的可压缩性。
扩展版 Octree-AnyGS 把同样的八叉树骨架推广到 2DGS / Scaffold-GS / 3DGS 任一基元。
H-3DGS:合并出来的 LoD(自下而上)。Octree-GS:先建八叉树(自上而下)。
两条路通同一个目标。
§22Level-of-Gaussians (LoG) · 端到端学 LoD
LoG
— Level of Gaussians
关键想法:跟 Octree-GS 同期但更"暴力":
维护一棵树,每个节点直接持有自己的 Gaussian,
粗到细 渐进训练——先训上层,
上层稳定了再展开下一层,
端到端可微地学到一个层级。
单卡 RTX 4090 训百万平方米的城市。
§23LODGE · 把 LoD 推上移动端
LODGE
— Level-of-Detail Large-Scale Gaussian Splatting with Efficient Rendering
关键想法:训练完的大场景 H-3DGS / CityGaussian 模型
在渲染时还是装不进手机 GPU。
LODGE 在已有大场景模型上构建一个后处理 LoD:
depth-aware 3D 平滑滤波 + 重要度剪枝 + 逐层 fine-tune;
再加一个"相机距离感知"的 Gaussian 子集挑选器,
在内存受限设备上实时渲染。
§24Virtual-Memory 3DGS · 把操作系统那套搬进 GS
Virtual Memory for 3DGS
关键想法:直接套用 OS 里的虚拟内存 / virtual texturing
思想:把所有 Gaussian 放在主存(甚至 SSD),
根据当前视角识别"可见的 Gaussian 页"按需 (just-in-time)
流式上传到 GPU。
LoD 是算法上不渲染远处细节;virtual memory 是系统上
根本就不让它在显存里待着。两者互补。
§25Proxy-GS · 遮挡是 LoD 的天然朋友
Proxy-GS
— Unified Occlusion Priors for Training and Inference in Structured 3DGS
关键想法:在 Scaffold/Octree 类结构上加入显式的遮挡
先验:训练时用 proxy 几何(粗 mesh / voxel)判断哪些锚点被遮,
把它们的 loss 降权;推理时直接剪掉被遮的 LoD 分支。
在大场景上比 Octree-GS 快 2.5× 且质量更好。
§26PrismGS · 大场景版的 Mip-Splatting
PrismGS
— Physically-Grounded Anti-Aliasing for High-Fidelity Large-Scale 3DGS
城市级模型放在 4K 屏幕上拉近看,依然会"沸腾"。
Mip-Splatting 是为单物体设计的下限——城市级有自己的失败模式。
关键想法:金字塔多尺度监督(粗到细每一层都算 loss)+
一条物理下限的 Gaussian 最小尺寸约束
(根据采样定理 + 物理像素 footprint 推导),杀掉退化的亚像素 splat。
在 MatrixCity / Mill-19 / UrbanScene3D 4K 上 +1.5 dB PSNR。
§27StreetGaussians · 让车动起来
StreetGaussians
— Modeling Dynamic Urban Scenes with Gaussian Splatting
城市级场景的特例:自动驾驶数据。车、行人、自行车都在动。
把它们当作静态 Gaussian 来重建就糊了。
关键想法:把场景拆成静态背景 Gaussian + 每个动态
物体一组 Gaussian,物体 Gaussian 跟着可优化的 6DoF 轨迹一起跑,
颜色用 4D 球谐(加一个时间维)表示。$1066\times 1600$ 下 135 FPS。
§28DrivingGaussian · 环视相机 + LiDAR 先验
DrivingGaussian
— Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes
关键想法:增量式静态背景 + 动态 Gaussian Graph
(每个 actor 一个节点);用 LiDAR 点云做几何先验 anchor。
环视六相机一起喂进同一个模型。
StreetGaussians 主打"前向 + 后向单线相机";DrivingGaussian 主打
"环视 + LiDAR"——是面向真实自动驾驶系统的更全栈版本。
§29OmniRe · 别忘了行人
OmniRe
— Omni Urban Scene Reconstruction
前两篇驾驶 3DGS 把"动态物体"狭义地等同为"车"。行人、自行车手、推婴儿车的人
都是非刚体。
关键想法:把场景建模成 Gaussian 上的场景图,
每个节点对应一个 actor 类型,
刚体(车)用 6DoF 姿态,
非刚体(人)用 SMPL 等参数化模型做条件。
驾驶日志全长重建,跑到 60 Hz。
§30ReconDrive · 不再 per-scene 训了
ReconDrive
— Fast Feed-Forward 4D Gaussian Splatting for AD Scene Reconstruction
上面所有驾驶 GS 都是 per-scene 训练——一条新日志来了从头训
1–3 小时。真实部署需要的是"喂进去几秒钟出一个 3DGS"的前馈模型。
关键想法:以 VGGT 风格的 3D 基础模型为骨干,
接 hybrid Gaussian prediction heads(静态/动态各一头)+ 4D 时序合成模块。
前馈出场景表达,不要 per-scene 优化,
在 nuScenes 9 项指标里 8 项打过经典优化式方法。
StreetGaussians / DrivingGaussian / OmniRe:per-scene 优化。
ReconDrive:foundation model + feed-forward。这是 2026 自动驾驶
3DGS 的范式转折。
§31DGGT · 无位姿动态前馈
DGGT
— Feedforward 4D Reconstruction of Dynamic Driving Scenes using Unposed Images
关键想法:连 SfM / 位姿都不要——直接喂未标定的连续帧,
模型联合预测每帧 Gaussian 集合 + 相机位姿,
再用一个扩散模型做渲染细化。
Waymo / nuScenes 上零样本跨数据集泛化。
§32DroneSplat · 飞行采集的脏数据
DroneSplat
— Robust 3D Reconstruction from In-the-Wild Drone Imagery
无人机航拍:(i) 有动态干扰物(车流、行人、晾衣服的旗子);
(ii) 视角重叠少,MVS 不稳。
关键想法:local-global 分割 + 自适应阈值 mask 把动态像素
排除在 loss 之外;用 MVS 先验 + voxel-guided 优化弥补稀疏视角。
顺带发布 24 个真实无人机序列的基准。
§33HUG · 把分块也做成层级
HUG
— Hierarchical Urban Gaussian Splatting with Block-Based Reconstruction
关键想法:在分块训练之上再叠一层
层级结构——块内自己是层级的,块间也是层级的。
visibility-aware 数据划分 + 带权重的分块训练干掉接缝处的"重叠带"。
把 §10 (VG 分块) 和 §22 (LoG 层级) 在同一篇论文里融合。
§34ULSR-GS · 重表面,不重外观
ULSR-GS
— Ultra-Large-scale Surface Reconstruction GS with Multi-View Geometric Consistency
关键想法:从大场景 3DGS 提取出可用的城市级网格 (mesh)
是另一个挑战——点云够密但表面不一致。
ULSR-GS 做 point-to-photo 分块 + 最优视角匹配 + 多视角一致性稠密化,
专门为表面提取调优。把 SuGaR 那套思路放大到航拍尺度。
§35GauU-Scene · 这个领域终于有了基准
GauU-Scene v1 / v2
贡献:$1.5\,\text{km}^2$ (v1) / $3.5\,\text{km}^2$ (v2) 真实无人机 RGB
+ 带 LiDAR Ground Truth 的基准数据集。
把整个 large-scale 3DGS 领域从"各刷各的 Mill-19 / UrbanScene3D"
一步推到"所有人在同一个 km 级地表 GT 上比"。
§36UrbanGS · 2026 年的"城市级 3DGS 范式"候选
UrbanGS
— A Scalable and Efficient Architecture for Geometrically Accurate Large-Scene Reconstruction
关键想法:把过去三年的所有招数拼回到一篇里——
- Depth-Consistent D-Normal 正则(来自 2DGS / 法向一致性家族)—— 几何
- 空间自适应 Gaussian 剪枝(来自 LightGaussian 家族)—— 显存
- 统一的分块 + 视角分配(来自 VG / DOGS 家族)—— 训练吞吐
把分块、几何、压缩三轴在一个流水线里同时做。
自称"first pruning framework designed for city-scale 3DGS"。
跟 LoBE-GS + PrismGS + CityGS-X 一起被视为
"2026 年版本的 VastGaussian"。
§37GS-Scale · 把 Gaussian 放主存里
GS-Scale
— Unlocking Large-Scale 3DGS Training via Host Offloading
关键想法:所有 Gaussian 常驻 CPU 内存,
每个 iter 只把本帧可见的子集流式上传到 GPU,
优化器更新也在 CPU 上 pipeline。
算法本身一字不改,GPU 显存峰值 -3.3–5.6×,
单 RTX 4070 Mobile 能跑 4M → 18M Gaussian。
跟 DOGS / Grendel 正交:DOGS / Grendel 用多卡来扩,
GS-Scale 用 host memory 来扩单卡上限。
§38From Orbit to Ground · 几张卫星图建一座城
Orbit2Ground
— Generative City Photogrammetry from Extreme Off-Nadir Satellite Images
关键想法:用几张极偏角的卫星图重建一座真实的
$4\,\text{km}^2$ 城市,并合成地面视角。表达上是 2.5D Z-monotonic SDF 高程场 +
生成式纹理还原网络。卫星 → 3DGS-地面渲染的当前最强 demo。
§39GaussianCity · 不重建,直接生成一座城
GaussianCity
— Generative Gaussian Splatting for Unbounded 3D City Generation
在大场景生成的世界(CityDreamer 等)里,朴素地"先生成 mesh / NeRF
再转 3DGS"会爆出几十亿点 + 100 GB+ 显存。
关键想法:用 BEV-Point 作为中间表达——
一张鸟瞰图压缩了无界城市的所有信息,
使显存与城市大小无关。
再用一个空间感知的 Gaussian 属性解码器把 BEV-Point 转成 3DGS。
比 CityDreamer 快 60×,10.72 FPS。
§40Spark 2.0 / Mobile-GS · 浏览器里漫游城市
Spark 2.0 (World Labs)
— Streaming >100M-splat scenes in the browser
不是论文,但代表了 2026 年大场景 3DGS 落地的工程现实:
WebGL2 / three.js 内的虚拟内存式 LoD 流渲染,
一亿 splat 的场景能在普通笔记本浏览器里跑。
Mobile-GS
关键想法:移动端实时 3DGS——量化的 Gaussian 表达 + 移动 GPU
友好的 tile-based 重写。和 Spark 2.0、Cesium 3D Tiles 一起组成了
"客户端大场景 3DGS"的当前栈。
§41仍然没解决的问题
站到 2026 年 5 月这个时间点回看,下面这些坑还在挖:
-
城市级 Gaussian 视频(4D 大场景)。Street/DrivingGaussian /
OmniRe 解决的是"长几公里、几分钟"的驾驶日志;
"整座城市跨季节的 4D"仍是空白。StreamLoD-GS(arXiv 2601.18475)只到房间
/ 舞台尺度。
-
真正的文本→城市 3DGS。GaussianCity 是"语义图→城",
Orbit2Ground 是"卫星图→城",语言条件下的 城市级 3DGS 还没出现。
-
城市级前馈基础模型。驾驶侧已经有 ReconDrive / DGGT 了,
但喂进 5000 张航拍图、出一座城的城市级 LRM 还没人发。
VGG-T$^3$ 把内存问题往前推了一步。
-
真正统一的 anchors + octree + LoD + distributed 框架。
CityGS-X 最接近,但它把四件事放在一个训练流水线里——
四个轴 真正 解耦、可独立替换的框架还没出现。
-
光照 / 时间分解。VG 的 decoupled appearance 是个 hack;
真正分解出"反照率 + 局部光照 + 季节性"还是开放问题。
总结一句话
Large-scale 3DGS 的故事可以简化成两件事:
(a) 怎么训得下 → 分块 + 共识 + LoD;
(b) 怎么渲得起 → LoD + 虚拟内存 + 压缩。
所有论文都是在 (a) (b) 这张图里某个角落"上一颗螺丝"。
§A名词表 · Glossary
| 术语 | 解释 |
| Anchor | Scaffold-GS 引入的稀疏体素中心点;每个 anchor 负责生成 $k$ 个 Gaussian。 |
| ADMM | Alternating Direction Method of Multipliers,分布式优化里达成共识的经典方法,DOGS 用它做分块训练的协调器。 |
| Densification (稠密化) | 3DGS 训练中根据梯度对 Gaussian 做 split / clone 的过程。 |
| EWA splatting | Elliptical Weighted Average splatting (Zwicker 2001);3DGS 用它把 3D 椭球的协方差投影成屏幕空间的 2D 椭圆。 |
| LoD | Level of Detail——根据相机距离 / 屏幕投影大小切换原语精细度。 |
| SH (Spherical Harmonics) | 球谐函数,3DGS 用它编码视角依赖颜色,degree 3 = $16$ basis $\times$ $3$ channels = $48$ floats。 |
| Tile-based rasterization | 把屏幕切成 $16\times 16$ 像素的 tile,每个 Gaussian 只参与它能碰到的 tile,避免每像素串行。 |
| VRAM wall | 大场景里 Gaussian 数量 $\times$ 字节数超出单卡显存的现象;驱动了分块、LoD、virtual memory 三条路。 |
§B推荐阅读顺序
读完本文,下一步——按这个顺序读原文比按发表时间读高效:
- Kerbl 2023 (原 3DGS) → 把渲染算法读通。
- Scaffold-GS → 理解为什么"锚点 + 解码器"是必经之路。
- Mip-Splatting → 理解为什么抗锯齿是 LoD 的前提。
- VastGaussian → 城市级 3DGS 的开端。
- Hierarchical-3DGS → 系统化的 LoD 解法。
- CityGaussian → 训得下 + 渲得快的第一篇。
- DOGS → 看分布式优化怎么进 3DGS。
- Octree-GS / LoG → 锚点 + 八叉树的两种实现。
- StreetGaussians + OmniRe → 驾驶场景特殊性。
- CityGaussianV2 + Momentum-GS + LoBE-GS → 2024→2025 范式如何演进。
- UrbanGS + CityGS-X + GS-Scale → 2026 年的"组合拳"。