资讯动态

彻底搞懂3DGS|不用神经网络逐点查询,为什么一团团高斯也能渲染三维世界?

发布时间:2026/10/29 20:05:01 来源:尧图企业网站定制
目录01 NeRF 已经能生成新视角为什么还需要 3DGS02 一颗高斯不只是一个“点”而是一小团可调整的空间分布03 Splatting把三维高斯“投”到屏幕上照片就出来了吗04 一开始只有稀疏点怎么长成细节丰富的场景05 3DGS 为什么能快快到什么程度06 训练几分钟就能用为什么还要继续优化07 画面已经很真实能不能直接当成三维地图08 写在最后为了将算法知识真正转化为解决问题的能力我们开设了《算法详解》专栏。每一期都会拆解一个经典算法不只讲公式更希望把它为什么出现、真正解决什么以及放进实际系统以后会遇到哪些问题讲清楚。绕着一辆自行车拍下几十张照片再把虚拟相机放到从没拍过的位置电脑能不能把那里的画面还原出来NeRF 已经证明这件事可以通过学习三维场景的辐射场来完成。但对于原始 NeRF 而言要渲染一张照片往往得沿着每个像素对应的光线反复采样、查询网络。画面可以很逼真计算却不轻松。之后虽然出现了 Instant-NGP、Plenoxels 等加速路线高画质、大场景和实时渲染之间仍然存在明显的取舍。2023 年SIGGRAPH 论文3D Gaussian Splatting for Real-Time Radiance Field Rendering提出了一种很有代表性的改变不再把场景主要藏在一个需要反复查询的神经网络里而是用大量可以直接优化、直接投影到屏幕上的三维高斯3D Gaussians来表示场景。这篇《算法详解》我们沿着三个问题展开一团“高斯”到底存了什么这些高斯怎么变成照片为什么这种做法既能训练出细节又能快速渲染01 NeRF 已经能生成新视角为什么还需要 3DGS理解 3DGS最好的起点不是高斯分布的数学公式而是先想想电脑生成一张图像时究竟把时间花在了哪里在经典 NeRF 中场景主要由神经网络描述。为了知道画面某个像素是什么颜色系统会从相机发出一条光线沿光线选取许多三维采样点再查询对应的密度与颜色通过体渲染合成像素。它的优势是表示连续、能够学习复杂外观代价是大量空间查询与采样计算。尤其当分辨率升到 1080p、场景又足够复杂时这份开销会变得显著。但观察真正的场景我们又会发现一个现象空间中绝大多数位置其实没有可见内容。一辆自行车的金属框架、草地上的叶片、房间里的桌椅只占据了三维空间的一部分。为了得到相机画面不一定要反复检查光线沿途的每一个候选位置。3DGS 的思路是先把值得渲染的场景内容用一批明确的三维基元表示出来。到了新视角再把这些基元投影到图像平面上快速计算它们对像素的贡献。这里需要澄清一点3DGS 不是第一个放弃大 MLP 的方法也不是简单宣称“高斯一定比神经网络好”。在它之前快速辐射场表示已经有体素、哈希网格等路线。3DGS 的独特之处是把显式、可微的高斯表示能够增减的基元集合以及 GPU 友好的可见性渲染放在同一个方案中。那么一颗三维高斯究竟是什么02 一颗高斯不只是一个“点”而是一小团可调整的空间分布先从点云想起。传统点云里的一个点通常记录一个三维坐标可能还附带颜色。可如果只是把稀疏点云直接投影到相机上画面往往会露出很多空洞。把每个点都画得很大又容易把细小结构糊成一片。3DGS 没有把场景基元限制成一个没有体积的点而是用三维高斯分布来描述它在周围空间的影响范围。通俗地说每个基元更接近一团位置、大小、方向都能调整的半透明“云”。在原始 3DGS 中一颗高斯至少涉及几类核心属性位置这团高斯放在三维空间的哪里。形状与朝向它沿各个方向延伸多远能否被拉长、压扁和旋转。论文用协方差描述这种空间形状在实现里通常由尺度和旋转参数构造。不透明度它被投影到图像上以后会在多大程度上遮挡后面的内容。颜色与方向相关外观它从不同方向看可以有不同的颜色表现原始方法使用球谐函数Spherical HarmonicsSH系数表达这一点。这里最重要的不是记住参数名而是理解为什么高斯需要能拉伸、能旋转。想象一堵很薄的墙或者自行车的一根细长车架。如果每颗高斯都只能是圆球要么需要堆很多球才能贴合表面要么就会让物体看起来臃肿。让高斯变成扁平或细长的椭球就有机会用更少的基元贴合复杂形状。这叫各向异性Anisotropy。它是原始 3DGS 很重要的设计而不是一个装饰性的可选参数。论文的消融对比显示去掉各向异性、强制高斯各方向尺寸相同会明显削弱对细节结构的表达。图1 | 高斯可以被拉长、压扁并旋转从而贴合细长或扁平的物体结构。如果只能使用球形高斯同样的细节往往需要更多基元也容易出现模糊。还要注意高斯椭球不是已经恢复出的实体表面。它是一种参与图像渲染的连续基元几颗高斯可以重叠颜色和透明度共同决定最终画面。能把场景看起来还原得逼真并不意味着每个椭球都能直接当作机器人碰撞检测里的真实物体。03 Splatting把三维高斯“投”到屏幕上照片就出来了吗现在假设我们已经得到了很多三维高斯并且知道虚拟相机的姿态。要渲染新视角第一步是把三维基元投影到相机画面。一颗被拉长的三维高斯换个方向看屏幕上的形状也会改变。它可能投影成一个细长的椭圆也可能接近圆形。Splatting泼溅式渲染可以先理解为每颗高斯在二维画面上留下一个有范围、强度向周围渐弱的“印迹”再把许多印迹叠加起来形成图像。但问题没有结束。如果只把所有颜色简单加起来前景和背景就会混在一起。比如自行车车轮位于树木前方后面的树叶不能不受遮挡地透过整个车轮显示出来。因此3DGS 的渲染还需要处理可见性与透明度合成Alpha Blending。对于影响同一像素的高斯渲染器按照大致的前后深度顺序合成颜色靠前且不透明的部分贡献更大同时减少后面内容还能透过来的比例。从这个意义上说3DGS 并没有抛弃 NeRF 背后的“沿视线合成可见颜色”的思想。它的图像形成思路与体渲染有紧密联系真正改变的是参与合成的内容怎么组织、怎么投影以及怎么高速计算。原始方法进一步把屏幕切成许多16×16 像素的 Tile图像小块。每颗高斯只分配给可能被它覆盖的 Tile之后借助 GPU 上的快速排序组织每个 Tile 内的候选高斯再进行像素颜色合成。这样就不必对画面每一个像素都重新遍历所有场景基元。不过它也不是物理上严格的逐光线求交。原论文使用基于 Tile 和深度的近似排序不对每个像素重新精确排序因此个别视角下仍可能出现可见性顺序改变等伪影。图2 | 多视角照片先经过 SfM 得到相机位姿和稀疏点云再初始化一组可优化的三维高斯。渲染结果与真实照片比较后误差会继续调整高斯的属性和分布密度。现在还有一个更重要的问题照片里有几百万处细节刚开始的高斯应该摆在哪里又怎么知道哪里需要更多高斯04 一开始只有稀疏点怎么长成细节丰富的场景原始 3DGS 的典型输入并不是凭空生成的一堆高斯而是一组静态场景的多视角照片以及相机标定得到的位姿和稀疏点云。这些结果可以通过 SfMStructure from Motion流程得到实际项目中经常借助 COLMAP 等工具。稀疏点云提供一个很好的起点它至少告诉系统哪些空间位置在多个视角下比较可能对应真实场景结构。3DGS 可以先在这些位置放上初始高斯再根据照片优化。对于一些已知边界的合成场景也可以使用随机初始化不能简单认为它必须依赖一份高密度、精确的三维重建。优化时系统从训练相机里选一个视角用当前高斯集合渲染出图像再和真实照片比较。哪里颜色不对、细节缺失或者遮挡关系不合理图像误差就通过可微渲染反馈到各颗高斯的参数上有的要移动位置有的要改变尺度或朝向有的要调整颜色、不透明度。这和 NeRF 的训练仍然有共通点目标依然是让一份三维表示同时解释不同相机拍摄到的二维图像。 差别是3DGS 主要直接优化一组显式高斯的属性而不是训练一个负责回答每处空间查询的辐射场 MLP。但仅靠修改现有高斯还不够。假设一开始只有一颗很小的高斯面对一片有复杂纹理的区域就算把它调得再准确也很难覆盖所有细节。反过来如果一个大高斯胡乱覆盖了一整片复杂表面再怎么调整颜色可能仍然糊成一团。于是原论文增加了自适应密度控制Adaptive Density Control不仅调整现有高斯还允许根据优化情况增加或移除高斯。具体可以先记住三种操作Clone复制某个区域缺少足够覆盖但已有高斯尺度较小可以复制出新的高斯让它们继续移动和优化补上缺失的结构。Split拆分某颗高斯尺度太大却试图承担很多不同的细节就把它拆成更小的基元重新分配覆盖范围。Prune剔除对那些几乎透明、没有必要保留的高斯进行移除避免所有候选基元无节制增长。原论文并不是简单按照“画面哪里像素误差最大”直接加高斯而是结合高斯在视图空间中的位置梯度等信号判断哪些区域需要增密。这一点是工程实现时的重要区别。图3 | 3DGS 会根据局部覆盖情况增加高斯较小的高斯可以复制补足尚未表达的区域过大的高斯可以拆成更小的基元以表达更细的结构然后继续优化。这里也能看出3DGS 并不是把 SfM 点云稍微上色以后就结束。它真正训练的是一个基元位置、形状、透明度和数量都在动态变化的场景表示。05 3DGS 为什么能快快到什么程度到这里3DGS 的核心机制已经比较完整从稀疏点出发把场景组织成可优化的高斯集合根据照片不断调整参数和密度渲染时再利用图像分块、排序和透明度合成快速得到新视角。它的速度优势主要来自两边的配合。第一表示是显式的。渲染时不必为了每条光线在许多预设采样位置反复查询一个大型神经网络。系统可以直接处理当前视角可能看见、会投影到画面里的高斯。第二计算非常适合 GPU 并行。投影、筛选、分块、排序和合成可以围绕大批基元组织起来。原论文专门设计了可微 Tile Rasterizer不仅加快推理渲染也能把图像误差高效传回高斯参数让训练本身受益。论文里的结果很有代表性。在Mip-NeRF360 场景集合上30K 迭代配置的平均训练时间约为41 分 33 秒平均渲染速度约134 FPS对应的模型参数内存约734 MB。论文采用的主要测试 GPU 是NVIDIA A6000这些数字是特定数据集、分辨率和实现条件下的结果并不意味着任何显卡、任意场景都能达到同样帧率。对照之下论文使用的高质量 Mip-NeRF360 基线训练开销和渲染开销明显更高但 Instant-NGP 等快速方法也很值得强调它们并不是完全不能加速 NeRF而是在当时的质量、速度和表示成本之间做了不同取舍。图4 | Bicycle 场景的对比展示了画质、训练时间和渲染速度之间的取舍。3DGS 的优势是在保持较好画面质量的同时让新视角渲染达到实时速度。图中数据属于特定实验设置。需要注意的是训练更快、渲染更快不等于模型更省存储或显存。3DGS 要保存大量高斯每颗还携带位置、尺度、旋转、透明度和外观参数。场景复杂以后数十万乃至数百万颗高斯会产生相当可观的模型体积。显式表示降低了部分计算负担却把一部分代价转移到了存储、显存和数据传输上。06 训练几分钟就能用为什么还要继续优化3DGS 的另一个特点是训练不同阶段的结果可以比较直观地呈现在画面里。最开始高斯位置和颜色都不够准确渲染画面会模糊、空洞或者出现漂浮的杂点。随着梯度优化、复制、拆分和剔除不断进行场景结构逐渐稳定细节也更容易被表现出来。但训练时间并不是一个可以无限缩短而不损失效果的数字。原论文除了 30K 迭代配置还专门报告了7K 迭代的快速版本。它在一些场景里已经可以取得不错的外观但复杂的背景和小尺度结构仍可能需要后续优化。图5 | 随着训练从 7K 次迭代继续到 30K 次一些场景里原本模糊的纹理和渲染伪影会逐渐改善但不同区域获得的收益并不相同。快速出图不等于细节已经充分收敛。如果真正打算把 3DGS 部署在系统里不能只盯着一个 FPS还要看从拍摄到能用的整条链路采集照片、估计相机位姿、SfM 稀疏重建、高斯训练、模型加载、渲染。实时渲染并不等于实时完成整个场景重建。同样这里“实时”说的是训练完毕的场景能够以较高帧率合成新视角图像并不表示输入视频里的动态物体都能被原始 3DGS 直接正确重建与持续更新。07 画面已经很真实能不能直接当成三维地图这是理解 3DGS 时最容易产生的一个误区。很多展示里我们能绕着一辆车、一栋建筑甚至整条街道自由移动虚拟相机。乍看之下似乎场景的三维结构已经被完整恢复了。但 3DGS 最直接优化的目标仍然是新视角渲染质量而不是让每一颗高斯都对应可靠的实体表面。例如一面白墙在观察较充分时可以被许多扁平高斯很好地渲染出来可如果墙角背面没有拍到或照片里存在大量反光某些高斯的位置和形状就未必对应唯一正确的几何解释。高斯本身还具有重叠、不透明度渐变等特性无法简单把它们当成一张可以直接用于碰撞检测的网格地图。原论文还明确讨论了几类问题。视角覆盖不足时模型容易出现缺失细节或奇怪的细长高斯某些新视角下高斯的前后排序和剔除关系突然变化可能出现画面跳动Popping遇到大型场景训练和渲染所需的显存也会变成明显约束。如果系统需要的是机器人导航、定位或空间操作那么最终可能还要进一步处理表面提取、几何一致性、深度可靠性和动态更新。后续确实出现了面向几何重建、SLAM、压缩和动态场景的各种 Gaussian Splatting 扩展但不能把这些后来方法的能力直接算到 2023 年原始 3DGS 身上。这也是 3DGS 工程价值最值得客观看待的地方它显著降低了高质量新视角合成的渲染门槛却不意味着从照片到可靠三维世界的所有问题都已经被解决。08 写在最后如果把 NeRF 和 3DGS 放在一起看它们都试图从多视角照片中学习一份能够生成新视角的三维场景表示也都依赖图像监督和可微渲染。区别在于经典 NeRF 主要把场景表示成一个可以查询的连续函数渲染时沿光线密集采样3DGS 则把表示放在一组可以直接优化的三维高斯中再利用投影、可见性排序和 Splatting 高效生成图像。3DGS 最重要的贡献不是“高斯比神经网络更聪明”而是它重新组织了场景表示和渲染计算把需要反复查询的空间信息变成能够直接投到屏幕、适合 GPU 并行处理的显式基元。而高斯之所以能把画面撑起来也不是简单因为数量够多。它们可以改变形状、方向、透明度和颜色还可以在训练中被复制、拆分或移除让表示能力逐渐集中到真正需要细节的地方。从这里可以得到一个比“哪种算法更快”更有价值的认识三维视觉系统的能力不只取决于学习方法有多强也取决于它把场景组织成什么形式以及这种形式是否适合后续计算。3DGS 为高质量实时新视角渲染提供了一条非常有影响力的路线。至于场景的几何是否可靠、模型能否轻量化、动态环境能否持续更新则仍然需要结合具体应用继续解决。参考资料1. Bernhard Kerbl, Georgios Kopanas, Thomas Leimkühler, George Drettakis, 3D Gaussian Splatting for Real-Time Radiance Field Rendering, ACM TOG / SIGGRAPH 2023. https://arxiv.org/abs/2308.040792. 3DGS 原作者项目主页https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3. 3DGS 官方代码与数据说明https://github.com/graphdeco-inria/gaussian-splatting4. Mildenhall et al., NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis, ECCV 2020. https://arxiv.org/abs/2003.089345. Papantonakis et al., Reducing the Memory Footprint of 3D Gaussian Splatting, I3D 2024. https://repo-sam.inria.fr/fungraph/reduced_3dgs/

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑