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

阅读路径建议

没碰过 3DGS:从 §1 顺序读到 §4,做完前两个交互 demo,再选你感兴趣的"族"(分块 / 层级 / 驾驶 / 航拍 / 前沿)跳读。 已经熟悉原始 3DGS:直接从 §10 VastGaussian 开始; 想看最近一年的新东西:跳到 第七部 · Frontier

§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$ 结构上就一定是对称正定的。

§2渲染方程:从 3D 高斯到屏幕像素

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$ 就是描述那个被 压扁的椭圆有多宽多扁。

Demo 1 · 2D Gaussian Splatting Playground
点击一个 Gaussian 来选中它(轮廓变橙色),按住椭圆中心 拖动 = 移动;按住右边或下边的橙点拖动 = 修改 $s_x$ 或 $s_y$; 滑动 $\theta$ 来旋转。先加进来的 Gaussian 在最前面(front-to-back 合成)。 这就是 3DGS 在 2D 上的简化版,所有数学是一样的。

核心前向:一个 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 快两个数量级

NeRF3DGS
每像素工作量 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 出生时却没有这一层。

Demo 2 · The Scale Wall (痛点的可视化)
把场景从一间房 ($10\,\text{m}^2$) 拉到一座城 ($10\,\text{km}^2$),看 Gaussian 数量与显存预算 一路撞穿各档 GPU 的"价签"。注意:勾上分块 / LoD / 压缩这三招—— 后面要讲的所有论文,本质都在做这三件事的某种组合。 (数字是教学用的玩具模型,不要拿去发论文。)

§5Scaffold-GS · 锚点结构

Scaffold-GS — Structured 3D Gaussians for View-Adaptive Rendering
CVPR 2024 Highlight Lu, Yu, Belongie, Lin, Dai, Lin · CUHK / Shanghai AI Lab · arXiv:2312.00109 · code

原版 3DGS 让每个 Gaussian 自由漂浮,产生大量冗余原语,且对视角与光照变化 脆弱——这在大场景里是致命的。

关键想法:把场景体素化成稀疏的锚点 (anchor) 网格,每个锚点持有一组"待生成"的 Gaussian。渲染时, 一个小 MLP 根据视角方向、视距, 动态预测这些 Gaussian 的位置偏移、不透明度、协方差、颜色。 锚点本身在训练中根据"贡献度"加密 / 修剪。

Scaffold-GS 是几乎所有后续大场景工作的结构性脚手架: Octree-GS、LoG、CityGS-X 都在它的"锚点 + 解码器"模板上做拓展。

§6Mip-Splatting · 把锯齿干掉

Mip-Splatting — Alias-free 3D Gaussian Splatting
CVPR 2024 · Best Student Paper Yu, Chen, Huang, Sattler, Geiger · Tübingen · arXiv:2311.16493 · project

缩放或换焦距时,原版 3DGS 会出现严重锯齿——飞越城市时镜头从特写拉到全景, 画面会"沸腾"。

关键想法:参照经典 mipmap,给每个 Gaussian 加两个滤波器:

  1. 3D 平滑滤波 (smoothing filter):训练时根据所有训练 视角的采样率,给每个 Gaussian 的 3D 协方差加一个最小尺寸下限, 防止它在 3D 里"比一个采样点还细"。
  2. 2D Mip 滤波:测试时根据新视角的像素覆盖率, 把 2D 协方差再做一次盒滤波,效果上等于"在不同 mip 层上取样"。

数学上是 EWA splatting 论文里被遗忘了二十年的另一半(pre-filter) 被翻出来重新拼回来。在大场景里这块尤其重要—— 任何 LoD 工作都必须先解决锯齿,否则切层时会看见跳变。

§7AbsGS / Pixel-GS · 把稠密化修对

AbsGS — Recovering Fine Details for 3D Gaussian Splatting
arXiv 2024 / CVPR 2025 line · arXiv:2404.10484

原版稠密化用的是带符号的视角空间梯度——一个 Gaussian 被左右两次视角推向相反方向,梯度会相互抵消, 本该被切分的大模糊 Gaussian 反而留下了。这就是论文说的 gradient collision

关键想法:改用同向 (absolute / homodirectional) 的梯度作为切分阈值。这一字之差,让大场景里的"奶油色雾霾"消失了一大半。

Pixel-GS — Pixel-aware Gradient Densification
ECCV 2024 Zhang, Hu, Lao, He, Zhao · HKU · arXiv:2403.15530

关键想法:在累加每个视角对稠密化梯度的贡献时, 按该视角下 Gaussian 投影占的像素面积加权。 覆盖面积大的视角说话声音大、覆盖面积小的小声—— 这刚好解决了航拍 / 城市场景里 SfM 点云稀疏导致的"针状 / 块状伪影"。

把 AbsGS 和 Pixel-GS 一起记住:它们是所有大场景论文默认开启 的"稠密化补丁",地位类似 ResNet 里的 BN。

§82DGS · 让 Gaussian 贴在表面上

2DGS — 2D Gaussian Splatting for Geometrically Accurate Radiance Fields
SIGGRAPH 2024 Huang, Yu, Chen, Geiger, Gao · arXiv:2403.17888 · project

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
NeurIPS 2024 Spotlight Fan et al. · UT Austin · arXiv:2311.17245 · project

三件事一起做:

  1. 剪枝:算每个 Gaussian 的"全局重要度" (global significance), 砍掉对最终图像贡献小的。
  2. SH 蒸馏:用增广视角监督把 degree-3 的 SH 蒸到 degree-2 / 1, 系数数 48 → 27 / 12。
  3. 向量量化:剩下的属性用 codebook 编码。

它本身不是为大场景设计的,但它就是大场景的部署武器—— Hierarchical-3DGS、CityGaussian 出来的几十 GB 模型,配 LightGaussian 之后 才进得了浏览器、进得了手机。

§10VastGaussian · 把城市切成块,每块单独训

VastGaussian — Vast 3D Gaussians for Large Scene Reconstruction
CVPR 2024 Lin et al. · THU / Huawei · arXiv:2402.17427 · project

单卡训不下 / appearance 漂移。

关键想法:第一篇真正意义上的城市级 3DGS。 它做了两件事,从此成为整个分块流派的模板:

  1. Progressive cell-based partition + visibility-based 分配: 把场景在 XY 平面切成网格 cell。每个 cell 训自己的 Gaussian 集合。 关键的"airspace-aware":一张照片即使主点不落在 cell 内, 只要它的视锥看进 cell 上方,就分配给那个 cell。 (想象一架无人机在 cell 边缘上空拍 cell 中间——它必须帮 cell 中间训练。)
  2. Decoupled appearance modeling:每张训练图像挂一个 per-image embedding,过一个轻量 CNN 把当下光照 / 曝光 / 白平衡解耦 到一个 modulation 上。训练时它修正颜色误差,测试时直接丢掉, 留下的 Gaussian 是"平均光照"版的干净表示。

VastGaussian 是后续所有分块工作(DOGS, CityGaussian, BlockGaussian, LoBE-GS …)的祖师爷。如果你只读一篇分块论文,就读这篇。

Demo 3 · VastGaussian-style Camera-aware Partition
黑点 = 重建的 3D 点;周围的小三角 = 相机视锥;颜色 = cell 编号。 切到"可见性分块"看相机怎么被分配—— 边界相机不再按"我站哪儿",而是按"我看的是哪儿"。 鼠标悬停在某个 cell 上可以高亮它内部的点。

§11CityGaussian · 给城市加 LoD 金字塔

CityGaussian — Real-time High-quality Large-Scale Scene Rendering with Gaussians
ECCV 2024 Liu et al. · CASIA / Baidu · arXiv:2404.01133 · project

VastGaussian 训得动了,但渲染城市的时候还是慢—— 没有 LoD,远处的小细节也得整本字典翻一遍。

关键想法:训练阶段先训一个粗粒度的全局先验 (低分辨率 Gaussian 集合),然后用它指导每个 block 的精细化训练; 渲染阶段每个 block 自带一个压缩的 LoD 金字塔, 根据视角距离即时挑层。结果:实时帧率穿越城市,质量不掉。

VastGaussian = "训得下"。CityGaussian = "训得下 + 跑得起"。 第一次让"实时城市漫游"和"高保真 3DGS"在同一个工作里出现。

§12DOGS · 用 ADMM 让各块达成共识

DOGS — Distributed-Oriented Gaussian Splatting via Gaussian Consensus
NeurIPS 2024 Chen, Lee · NUS · arXiv:2405.13943 · code

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
ECCV 2024 Zhao et al. · NYU · arXiv:2406.18533

关键想法:跟 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
CVPR 2025 Fan et al. · USTC / Shanghai AI Lab · arXiv:2412.04887 · project

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
CVPR 2025 Jiang et al. · USTC / Shanghai AI Lab / CUHK · arXiv:2412.01745 · code

无人机俯拍 + 街上手持拍同一个城区, 两套照片在尺度、视角、覆盖密度上差异巨大。 分开训得两个不一致的 3DGS,合起来训直接发散。

关键想法:粗→精两阶段——先用航拍图建立空间骨架, 再喂入街景图精细化建筑立面 / 行人尺度细节, 通过精心设计的 anchor sharing + 渐进式分辨率提升让两个视图域在同一个 模型里收敛。配套发布了"aerial-to-ground"数据集。

§16BlockGaussian · 内容感知的自适应分块

BlockGaussian — Efficient Large-Scale Scene Novel View Synthesis via Adaptive Block-Based Gaussian Splatting
arXiv 2025-04 Wu et al. · Beihang · arXiv:2504.09048 · code

固定网格分块在空旷区域浪费容量, 在密集区域又训不下。

关键想法:根据 SfM 点密度让 block 大小自适应 (密集处小 block、空旷处大 block), 再加上 visibility-aware per-block 优化。 24 GB 单卡上能跑、训练 5× 加速。

§17CityGaussianV2 · 把基元换成 2DGS

CityGaussianV2 — Efficient and Geometrically Accurate Reconstruction for Large-Scale Scenes
ICLR 2025 Liu et al. · Shanghai AI Lab / CUHK · arXiv:2411.00771 · project

关键想法:把 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
ICLR 2026 submission · 2025-10 · arXiv:2510.01767

分块训练最大的隐藏问题:块大小不均匀。 一个市中心 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)
ICCV 2025 Gao et al. · arXiv:2503.23044 · project

"切→各自训→拼"流程里,那个 步骤本身就是个噩梦:边界 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
SIGGRAPH 2024 Kerbl, Meuleman, Kopanas, Wimmer, Lanvin, Drettakis · Inria / TU Wien · arXiv:2406.12080 · project

原班 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
arXiv 2024-03 / TPAMI 2025 extension Ren et al. · CUHK / Shanghai AI Lab · arXiv:2403.17898 · code

关键想法:把 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
ECCV 2024 Shuai, Guo, Xu, Lin, Peng, Bao, Zhou · ZJU3DV · project · code

关键想法:跟 Octree-GS 同期但更"暴力": 维护一棵树,每个节点直接持有自己的 Gaussian, 粗到细 渐进训练——先训上层, 上层稳定了再展开下一层, 端到端可微地学到一个层级。 单卡 RTX 4090 训百万平方米的城市。

§23LODGE · 把 LoD 推上移动端

LODGE — Level-of-Detail Large-Scale Gaussian Splatting with Efficient Rendering
arXiv 2025-05 · arXiv:2505.23158

关键想法:训练完的大场景 H-3DGS / CityGaussian 模型 在渲染时还是装不进手机 GPU。 LODGE 在已有大场景模型上构建一个后处理 LoD: depth-aware 3D 平滑滤波 + 重要度剪枝 + 逐层 fine-tune; 再加一个"相机距离感知"的 Gaussian 子集挑选器, 在内存受限设备上实时渲染。

§24Virtual-Memory 3DGS · 把操作系统那套搬进 GS

Virtual Memory for 3DGS
arXiv 2025-06 · arXiv:2506.19415

关键想法:直接套用 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
arXiv 2025-09 / 2026-03 update · arXiv:2509.24421

关键想法:在 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
arXiv 2025-10 · arXiv:2510.07830

城市级模型放在 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
ECCV 2024 Yan, Lin, Zhou et al. · ZJU3DV / Li Auto · arXiv:2401.01339 · code

城市级场景的特例:自动驾驶数据。车、行人、自行车都在动。 把它们当作静态 Gaussian 来重建就糊了。

关键想法:把场景拆成静态背景 Gaussian + 每个动态 物体一组 Gaussian,物体 Gaussian 跟着可优化的 6DoF 轨迹一起跑, 颜色用 4D 球谐(加一个时间维)表示。$1066\times 1600$ 下 135 FPS。

§28DrivingGaussian · 环视相机 + LiDAR 先验

DrivingGaussian — Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes
CVPR 2024 Zhou, Lin et al. · PKU / Li Auto · arXiv:2312.07920

关键想法:增量式静态背景 + 动态 Gaussian Graph (每个 actor 一个节点);用 LiDAR 点云做几何先验 anchor。 环视六相机一起喂进同一个模型。

StreetGaussians 主打"前向 + 后向单线相机";DrivingGaussian 主打 "环视 + LiDAR"——是面向真实自动驾驶系统的更全栈版本。

§29OmniRe · 别忘了行人

OmniRe — Omni Urban Scene Reconstruction
ICLR 2025 Spotlight Chen, Yang, Huang et al. · NVIDIA AVG / USC / Stanford · arXiv:2408.16760 · project

前两篇驾驶 3DGS 把"动态物体"狭义地等同为"车"。行人、自行车手、推婴儿车的人 都是非刚体。

关键想法:把场景建模成 Gaussian 上的场景图, 每个节点对应一个 actor 类型, 刚体(车)用 6DoF 姿态, 非刚体(人)用 SMPL 等参数化模型做条件。 驾驶日志全长重建,跑到 60 Hz。

§30ReconDrive · 不再 per-scene 训了

ReconDrive — Fast Feed-Forward 4D Gaussian Splatting for AD Scene Reconstruction
2026-03 · arXiv:2603.07552

上面所有驾驶 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
2025-12 · arXiv:2512.03004

关键想法:连 SfM / 位姿都不要——直接喂未标定的连续帧, 模型联合预测每帧 Gaussian 集合 + 相机位姿, 再用一个扩散模型做渲染细化。 Waymo / nuScenes 上零样本跨数据集泛化。

§32DroneSplat · 飞行采集的脏数据

DroneSplat — Robust 3D Reconstruction from In-the-Wild Drone Imagery
CVPR 2025 Highlight Tang et al. · arXiv:2503.16964 · project

无人机航拍:(i) 有动态干扰物(车流、行人、晾衣服的旗子); (ii) 视角重叠少,MVS 不稳。

关键想法:local-global 分割 + 自适应阈值 mask 把动态像素 排除在 loss 之外;用 MVS 先验 + voxel-guided 优化弥补稀疏视角。 顺带发布 24 个真实无人机序列的基准。

§33HUG · 把分块也做成层级

HUG — Hierarchical Urban Gaussian Splatting with Block-Based Reconstruction
ICCV 2025 Su et al. · PKU · arXiv:2504.16606

关键想法:在分块训练之上再叠一层 层级结构——块内自己是层级的,块间也是层级的。 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
benchmark Xiong, Li, Saliteta et al. · CUHK-Shenzhen · v1 arXiv:2401.14032 · v2 arXiv:2404.04880

贡献:$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
2026-02 · arXiv:2602.02089

关键想法:把过去三年的所有招数拼回到一篇里——

  1. Depth-Consistent D-Normal 正则(来自 2DGS / 法向一致性家族)—— 几何
  2. 空间自适应 Gaussian 剪枝(来自 LightGaussian 家族)—— 显存
  3. 统一的分块 + 视角分配(来自 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
2025-09 · arXiv:2509.15645

关键想法:所有 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
2025-12 · arXiv:2512.07527 · project

关键想法:用几张极偏角的卫星图重建一座真实的 $4\,\text{km}^2$ 城市,并合成地面视角。表达上是 2.5D Z-monotonic SDF 高程场 + 生成式纹理还原网络。卫星 → 3DGS-地面渲染的当前最强 demo。

§39GaussianCity · 不重建,直接生成一座城

GaussianCity — Generative Gaussian Splatting for Unbounded 3D City Generation
CVPR 2025 Xie et al. · arXiv:2406.06526 · code

在大场景生成的世界(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
industrial 2026-04 · blog

不是论文,但代表了 2026 年大场景 3DGS 落地的工程现实: WebGL2 / three.js 内的虚拟内存式 LoD 流渲染, 一亿 splat 的场景能在普通笔记本浏览器里跑。

Mobile-GS
ICLR 2026 · 2026-03 · paper · code

关键想法:移动端实时 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

术语解释
AnchorScaffold-GS 引入的稀疏体素中心点;每个 anchor 负责生成 $k$ 个 Gaussian。
ADMMAlternating Direction Method of Multipliers,分布式优化里达成共识的经典方法,DOGS 用它做分块训练的协调器。
Densification (稠密化)3DGS 训练中根据梯度对 Gaussian 做 split / clone 的过程。
EWA splattingElliptical Weighted Average splatting (Zwicker 2001);3DGS 用它把 3D 椭球的协方差投影成屏幕空间的 2D 椭圆。
LoDLevel 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推荐阅读顺序

读完本文,下一步——按这个顺序读原文比按发表时间读高效:

  1. Kerbl 2023 (原 3DGS) → 把渲染算法读通。
  2. Scaffold-GS → 理解为什么"锚点 + 解码器"是必经之路。
  3. Mip-Splatting → 理解为什么抗锯齿是 LoD 的前提。
  4. VastGaussian → 城市级 3DGS 的开端。
  5. Hierarchical-3DGS → 系统化的 LoD 解法。
  6. CityGaussian → 训得下 + 渲得快的第一篇。
  7. DOGS → 看分布式优化怎么进 3DGS。
  8. Octree-GS / LoG → 锚点 + 八叉树的两种实现。
  9. StreetGaussians + OmniRe → 驾驶场景特殊性。
  10. CityGaussianV2 + Momentum-GS + LoBE-GS → 2024→2025 范式如何演进。
  11. UrbanGS + CityGS-X + GS-Scale → 2026 年的"组合拳"。

Made for learning. 完整 BibTeX、勘误、补遗欢迎 issue。 最后更新 2026-05-19。

本站所有内容基于公开发表论文 / arXiv preprint / 项目页 / 官方代码仓。 交互演示是 Canvas2D 的教学玩具, 数值不代表论文实际性能。