ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

3D Gaussian Splatting解决了什么问题?从NeRF到实时渲染的破局之路

3D Gaussian Splatting解决了什么问题?从NeRF到实时渲染的破局之路

1. 从“渲染一张图要等半天”说起:3D Gaussian Splatting 到底动了谁的蛋糕

如果你最近半年刷过图形学相关的技术社区,大概率会被“3D Gaussian Splatting”这个词反复刷屏。各种演示视频里,一个场景从几十张照片出发,几分钟内就能在浏览器里实时旋转、缩放、漫游,光影和细节还相当能打。很多人第一反应是“又一个新玩具”,但真正上手跑过一遍之后,你会发现它解决的不是一个小问题,而是过去十年里三维重建和实时渲染之间那道一直没被真正填平的鸿沟。

我先把结论摆在前面:3D Gaussian Splatting(后面我简称 3DGS)解决的核心问题,是在保证照片级真实感的前提下,把三维场景的表示、训练和实时渲染这三件事第一次比较优雅地捏在了一起。它既不像传统摄影测量那样只能给你一堆没有光泽的网格,也不像神经辐射场(NeRF)那样渲染一张图要等好几秒甚至几十秒。它用一堆带方向和形状的“高斯椭球”来描述场景,训练快、渲染快、编辑性还不错,这就是它为什么能在短时间内吸引这么多人的根本原因。

这篇文章是“3D Gaussian”系列的第二篇,第一篇我们聊了它是什么、基本数学形式长什么样。这一篇我们专门回答一个问题:它到底解决了什么问题?我会从传统方法的痛点讲起,把 NeRF 的贡献和局限掰开揉碎,再讲 3DGS 是怎么针对性地补位的,最后落到实操层面,告诉你哪些场景适合用它、哪些坑必须提前知道。不管你是做三维重建、数字孪生、游戏资产,还是单纯想把自己的房间做成可漫游的 3D 场景,这篇都能给你一个比较清晰的判断依据。

2. 先搞清楚旧世界有多难:三维重建与渲染的三条老路

要理解 3DGS 解决了什么问题,得先知道在它之前,大家是怎么干的,以及每条路都卡在哪里。我把主流方案大致分成三类:传统摄影测量与网格重建、显式点云与体素、以及神经辐射场。它们各有各的高光时刻,但也都留下了没填完的坑。

2.1 传统摄影测量:能出网格,但“真实感”是奢侈品

传统摄影测量(Photogrammetry)的思路很直观:你拍一堆照片,算法通过特征点匹配算出相机位姿,再三角化出一堆稀疏点,最后做稠密重建得到点云,再转成网格、贴上图。这条链路非常成熟,工具也多,工业界用了很多年。

它的优点很明确:输出是显式的网格加纹理,可以直接丢进游戏引擎、CAD 软件、渲染器里用,兼容性极好。但问题同样明显。第一,网格重建对表面假设很强,遇到反光、透明、细密结构(比如树叶、铁丝网、毛发)就容易糊成一团或者破洞。第二,光照是“烤”在纹理里的,你换个光源方向,阴影和高光全对不上,因为它根本没有把光照和材质分离出来。第三,想要高质量网格,计算量和人工修模成本都很高,一个中等场景修几天是常事。

所以传统摄影测量解决的是“有没有”的问题,解决不了“像不像、能不能实时换光照”的问题。对于需要照片级真实感又要实时交互的场景,它基本力不从心。

2.2 显式点云与体素:渲染快,但细节和连续性难两全

点云是最接近“原始扫描数据”的表示,激光雷达和摄影测量都能产出。它的好处是渲染起来可以很快,尤其是做 splatting 渲染时,把每个点画成一个带大小的小圆盘就行。体素则是把空间切成小格子,每个格子记录占用或颜色,结构规整、查询方便。

但这两条路都有硬伤。点云的问题是点与点之间没有连续性,你放大看就是一堆离散的圆片,表面不闭合,光照也没法正确计算,稍微换个角度就露馅。体素的问题是分辨率一高,内存就爆炸,而且体素化本身会带来块状伪影,想要细腻表面就得用很细的格子,代价承受不起。更关键的是,这两者都很难表达“这个表面在某个方向上反光特别强”这种各向异性的材质特性。

一句话总结:显式表示渲染快、可编辑,但要做到照片级真实感和连续表面,代价极高。

2.3 神经辐射场 NeRF:真实感拉满,但速度和编辑性是软肋

NeRF 的出现是真正的范式转变。它用一个多层感知机(MLP)把“空间位置 + 观察方向”映射到“颜色 + 密度”,然后用体渲染沿光线积分出像素颜色。训练时靠多视角照片做监督,学出来的场景真实感极强,反光、半透明、细密结构都能较好地还原,这是它拿奖拿到手软的原因。

但 NeRF 的代价也很直接。第一,渲染慢。原始 NeRF 渲染一张图要沿每条光线采样上百个点,每个点都要过一遍 MLP,一张图几秒到几十秒很正常,实时交互基本别想。虽然后续有各种加速变体(比如把场景存成哈希网格、八叉树、张量分解等),把渲染压到了接近实时,但训练和显存开销依然不小。第二,编辑性差。场景信息藏在网络权重里,你想删掉一个物体、移动一个家具,几乎无从下手,因为没有一个显式的几何结构让你去操作。第三,训练时间长,原始版本动辄一两天,加速版也要几十分钟到几小时。

NeRF 解决的是“真实感”的问题,而且解决得很漂亮,但它把“实时”和“可编辑”这两件事牺牲掉了。这就是 3DGS 登场时面对的战场:真实感已经有了标杆,缺的是一个既真实又实时、还能动手改的方案。

3. 3DGS 的破局点:用“会变形的小椭球”同时拿下速度与真实感

理解了旧世界的三条路,3DGS 的定位就非常清楚了。它没有推翻 NeRF 的体渲染框架,而是把“场景表示”从隐式网络换成了一堆显式的高斯椭球。每个高斯有自己的位置、协方差(决定它被拉成什么形状、朝哪个方向)、不透明度,以及用球谐函数表示的方向相关颜色。渲染时把这些椭球投影到屏幕上,按深度排序后做 alpha 混合,就得到最终图像。

这个设计看似简单,但它一次性回应了前面提到的多个痛点。我把它解决的问题拆成下面几个层面来讲,这样你能更清楚地看到每一步的取舍。

3.1 解决“真实感与实时性不可兼得”的老大难

3DGS 最直接的贡献,是把照片级真实感和实时渲染同时做到了。因为每个高斯是显式的、可以独立投影和混合的,渲染过程高度并行,现代 GPU 上跑到 100 FPS 以上并不罕见,分辨率高一点也能维持在交互水平。同时,由于它保留了体渲染的 alpha 混合机制,半透明、细密结构、方向相关的高光都能表达,真实感不输 NeRF 太多。

这里的关键在于“显式 + 可微 + 光栅化”这个组合。显式让渲染变成一次前向的投影和排序,不需要对每个像素做大量网络查询;可微让整个场景能从照片端到端优化;光栅化则充分利用了 GPU 的并行能力。三者叠加,才有了“训练几分钟、渲染上百帧”的表现。

3.2 解决“训练太慢、迭代成本太高”的问题

NeRF 训练慢,很大一部分原因是每条光线要采样很多点、每个点都要过网络。3DGS 把场景变成有限数量的高斯,训练时只需要对这些高斯做投影和混合,反向传播的路径短得多。实际跑下来,一个中等规模的场景,几十分钟内就能从照片优化到可看的程度,比原始 NeRF 快了一到两个数量级。

这对从业者意味着什么?意味着迭代周期从“天”变成了“小时甚至分钟”。你可以上午拍一组照片,中午跑完,下午就能在引擎里看效果、调参数、重新拍补拍。这种反馈速度上的变化,对项目节奏的影响是质变的,不只是“快一点”而已。

3.3 解决“场景不可编辑、没法二次创作”的尴尬

因为高斯是显式的,每个椭球都有明确的位置和形状,你可以直接对它们做操作:删掉一片区域、把某个物体整体平移、给某个高斯换个颜色、甚至把两个场景的高斯合并。这在 NeRF 里几乎是不可能完成的任务,因为信息分散在网络权重里,没有对应的几何实体。

这个特性打开了很多实际应用的门。比如做数字孪生时,你可以把扫描出来的场景里不需要的临时物体删掉;做虚拟拍摄时,可以把前景物体单独拎出来重新打光;做游戏资产时,可以把高斯场景和传统网格混合使用。可编辑性让 3DGS 从“只能看的 demo”变成了“能进工作流的资产”,这是它区别于纯研究玩具的重要标志。

3.4 解决“显式表示内存爆炸”的顾虑

有人会问,显式表示不是内存很贵吗?点云和体素不就是这么翻车的?3DGS 的巧妙之处在于,它不需要固定分辨率的网格,而是把高斯放在真正有表面的地方。空旷区域没有高斯,细节多的区域高斯密集,相当于一种自适应的空间分配。再加上训练过程中会做稠密化和剪枝,最终的高斯数量通常控制在几十万到几百万级别,配合合理的压缩,内存和显存开销是可以接受的。

当然,这不是说它没有内存问题,后面讲坑的时候我会细说。但相比“均匀切格子”的体素,它的空间利用率高得多,这是它能落地的关键之一。

4. 落到实操:3DGS 在哪些场景真正解决了问题

光讲原理容易飘,我们看看它在实际场景里到底解决了什么具体问题。我按几个典型方向来说,每个方向都对应一类过去很难受、现在明显改善的需求。

4.1 小场景快速重建:从拍照到可漫游只要一顿饭的功夫

这是 3DGS 最出圈的应用。你拿手机绕着一个物体或一个房间拍几十到上百张照片,用 COLMAP 之类的工具算出相机位姿,然后跑 3DGS 训练,几十分钟后就能得到一个可以实时漫游的场景。过去用 NeRF 做同样的事,训练要几个小时甚至更久,渲染还卡;用传统摄影测量,真实感和光照又差一截。

我实测过一个室内角落的场景,大约 80 张照片,位姿计算加训练总共不到一小时,出来的效果在浏览器里旋转非常流畅,桌面上的反光、墙角的阴影都还在。这种“随手拍、快速出”的能力,对做房产展示、文物数字化、电商商品 3D 展示的人来说,是实打实的效率提升。

4.2 大场景与户外重建:把“城市级”从论文拉进现实

大场景重建一直是难点,因为数据量大、视角多、光照变化复杂。3DGS 因为训练和渲染都快,配合分块和层次化策略,已经能处理街区级别的场景。虽然超大场景仍然需要工程上的分块管理和流式加载,但相比 NeRF 时代“一个大场景训练到天荒地老”,现在的可行性高了很多。

这里解决的核心问题是规模与成本的平衡。你不需要为了一个大场景准备夸张的算力,用消费级显卡配合合理的分块策略,就能做出可交互的户外漫游。这对做文旅、园区展示、自动驾驶仿真数据生成的人来说,意义很大。

4.3 动态与可编辑场景:让“扫描结果”变成“可加工素材”

前面提到可编辑性,这里展开说。因为高斯是显式的,做动态场景时可以对高斯做形变、跟踪、分层。比如把一个人从场景里分离出来,单独控制他的动作;或者把场景按语义分成地面、建筑、植被,分别处理。这些操作在 NeRF 里要么做不了,要么要额外训练一个网络,成本高且不灵活。

对做影视预演、虚拟制片、游戏关卡设计的人来说,可编辑的高斯场景意味着它可以直接进入创作管线,而不是只能当参考。你可以把扫描的场景当背景,把前景物体替换掉,重新打光,再渲染出来。这个工作流的顺畅程度,是过去很难想象的。

4.4 作为神经渲染的“加速底座”:给其他方法当基础设施

还有一类不那么显眼但很重要的价值:3DGS 正在成为一种基础表示,被用来加速其他神经渲染任务。比如把它和物理模拟结合做可变形物体,把它和生成模型结合做 3D 内容生成,把它和 SLAM 结合做实时建图。因为它渲染快、可微、显式,很多需要“快速试错”的研究都能拿它当底座。

这解决的是“研究迭代速度”的问题。过去很多想法受限于渲染太慢,验证一个假设要等很久;现在有了快速可微的渲染器,实验周期大大缩短。这种基础设施层面的价值,往往比单个应用更深远。

5. 别只看好处:3DGS 没解决或解决得不够好的问题

讲完它解决了什么,必须诚实地讲它没解决什么。任何方法都有边界,把边界讲清楚,你才能判断它适不适合你的项目。

5.1 内存与显存:大场景仍然是硬约束

高斯数量随场景复杂度增长,一个精细的大场景很容易到几百万甚至上千万个高斯,每个高斯要存位置、协方差、不透明度、球谐系数,显存占用相当可观。虽然有很多压缩和量化的工作,但在消费级硬件上跑超大场景仍然吃力。这是它相比“一个网络走天下”的 NeRF 在存储上的劣势。

5.2 几何质量:表面提取不是它的强项

3DGS 擅长的是“看起来对”,而不是“几何精确”。你从高斯场里提取网格,得到的表面往往比较噪,边缘不够锐利,做精确测量或 CAD 逆向时不够用。如果你的目标是拿到干净的网格做工程分析,传统摄影测量或专门的表面重建方法可能更合适。

5.3 光照与材质分离:仍然是开放问题

虽然球谐函数能表达方向相关颜色,但它本质上还是把光照“烤”进了颜色里,没有真正把材质和光照分离。这意味着你没法像 PBR 那样自由换光源、换环境贴图。想要真正可重打光的场景,还需要结合逆渲染的方法,这目前仍是研究热点,离成熟还有距离。

5.4 对输入数据的依赖:位姿和覆盖度很关键

3DGS 依赖准确的相机位姿,位姿算不准,训练结果就会糊或者漂。同时,它对拍摄覆盖度有要求,视角太稀疏或者有大量遮挡的区域,重建质量会明显下降。这一点和 NeRF 类似,不是它独有的问题,但上手时必须心里有数。

6. 实操避坑指南:我踩过的坑和对应的解法

这一节是给准备动手的人看的。下面这些经验,很多是文档里不会写、只有实际跑过才知道的。

6.1 拍摄阶段:宁多勿少,但别乱动

拍摄时尽量保持曝光和白平衡一致,避免自动模式来回跳。绕圈拍的时候,相邻照片要有足够重叠,一般建议 70% 以上。不要只拍一个高度,俯拍和仰拍都补一些,否则高处和低处的细节会缺失。我试过只拍一圈平视,结果桌面和地面边缘糊得厉害,补拍仰角后才好转。

6.2 位姿计算:COLMAP 参数别照搬默认

用 COLMAP 算位姿时,默认参数不一定适合所有场景。纹理弱的墙面、重复纹理的地砖,容易匹配失败。可以适当提高特征点数量、开启更多匹配策略。如果场景很大,建议分块处理再合并,不要一次性丢进去。位姿质量直接决定最终效果,这一步偷懒后面全白搭。

6.3 训练参数:稠密化和剪枝要盯着看

训练过程中高斯会不断稠密化和剪枝,参数设得太激进,高斯数量会爆炸,显存直接爆;设得太保守,细节又出不来。建议先用默认参数跑一遍,观察高斯数量增长曲线,再根据显存情况微调。如果发现某些区域高斯异常密集,往往是那里位姿不准或者有遮挡,回头检查数据比硬调参数更有效。

6.4 常见问题速查表

现象可能原因排查方向
渲染有大量漂浮物位姿不准或背景干扰检查 COLMAP 重投影误差,剔除异常帧
表面糊、细节丢失拍摄覆盖不足或高斯太少补拍视角,适当增加稠密化迭代
显存爆掉高斯数量过多或分辨率太高降低训练分辨率,收紧稠密化阈值
颜色忽明忽暗曝光不一致拍摄时锁定曝光,或做颜色归一化
边缘有拖影运动模糊或快门太慢重拍,保证拍摄时稳定

提示:训练前先用小分辨率快速跑一遍,确认位姿和整体效果没问题,再上高分辨率正式训练。这样能省下大量试错时间。

7. 我个人在实际操作中的体会

跑过几个场景之后,我最大的感受是:3DGS 真正的价值不在于它某一项指标多强,而在于它把“真实感、速度、可编辑”这三者拉到了一个都能接受的区间。过去你必须在它们之间做取舍,现在你可以说“我都要”,虽然每一项都不是极致,但组合起来就是能干活。

另一个体会是,数据质量永远比算法调参重要。我见过太多人花大量时间调训练参数,结果问题出在拍摄时曝光乱跳或者位姿算错。把拍摄和位姿这两步做扎实,后面基本就是顺水推舟。这个内容后续还可以往动态场景和可重打光方向扩展,那两块目前还有不少空白,值得持续关注。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进