做三维视觉这几年,我一直有个执念:从多视角图像重建出来的场景,不能只活在离线的离线烘焙里。NeRF那套神经辐射场确实惊艳,可训练动辄几小时、渲染一帧也要秒级,想看一个角度还得干等,更别说实时交互。所以当3D Gaussian Splatting for Real-Time Radiance Field Rendering这篇论文出现时,我的第一反应不是“又来了个新表示”,而是“终于有人把实时辐射场渲染这条路彻底打通了”。
这篇文章是我完整读这篇论文之后整理出来的笔记,不会按论文顺序逐段翻译,而是把我认为最关键的四件事讲透:它用什么样的场景表示、光栅化流程怎么做到可微且快、自适应密度控制为什么是核心发动机、以及复现时最容易翻车的细节。适合正在做三维重建、神经渲染、虚拟拍摄或数字人场景的读者,也适合刚入坑想快速理解这篇工作的同学。
1. 读这篇论文前,我建议你先搞懂的背景问题
1.1 神经辐射场的性能瓶颈到底卡在哪
在3DGS之前,讨论“实时辐射场渲染”是一件挺绝望的事。NeRF把整个场景编码进一个MLP网络,渲染一张图的过程不是“把多边形投影到屏幕上”,而是对每个像素沿视线方向采样几十上百个空间点,再把每个点的坐标和视角方向喂进网络,求出颜色和密度后做体积积分。你可以把NeRF想象成一个“现场问路”的过程:每渲染一个像素都要问几十次网络,上千个像素乘起来就是海量查询。
这个架构带来的结果是:训练原始NeRF动辄需要数小时甚至一天,渲染一张800×800左右的图也要几十秒。后续确实出现了一批加速方案,比如用体素网格缓存中间特征、用哈希编码降低MLP查询成本,但这些方案仍然属于“逐光线采样再积分”的范畴,离游戏引擎那种三角形光栅化还差得远。
更麻烦的是交互。你做一个重建项目,甲方或者合作方最常问的问题不是“PSNR多少”,而是“能不能转两下看看”。NeRF要预渲染一段视频才能转,中间改一个参数就要重新渲染;想让用户像逛模型网站一样自由旋转视角,基本不现实。所以这个领域一直缺的不是质量,而是速度。
1.2 3DGS换了一条赛道:从“隐式场积分”回到“显式基元光栅化”
3DGS最反直觉的地方在于:它把“连续场”的叙事彻底抛弃了。场景不再是一个由神经网络隐式定义的函数,而是一堆显式的、可以数得过来的3D高斯椭球。每个椭球有位置、有朝向、有大小的,还带着透明度和颜色。
渲染的时候,系统把所有椭球投影到图像平面上,变成一堆2D椭圆,按深度排序后做alpha混合。这本质上就是点云渲染的“Pro版本”:点云用零维的点表达场景,3DGS用一堆“小雾团”表达场景,既能像点一样自由增减,又能像网格一样填满表面、处理遮挡。
这个选择直接带来两个结果。第一,渲染过程完全落进GPU光栅化的加速范围,不涉及逐光线的网络推理,所以速度能达到上百FPS。第二,因为所有基元都是显式参数,训练时可以直接通过可微分光栅化把图像损失回传到每个椭球上,让它们不断调整位置、大小、朝向和透明度,同时算法还会自动决定“该不该多克隆几个椭球”“哪些椭球该拆开”。
一句话概括:3DGS不是用更快的办法做NeRF,而是换了一套完全不同的渲染路径。
1.3 读这篇论文前建议具备的知识栈
如果你本来就在做图形学或三维视觉,这篇论文的数学负担比想象中小很多。我建议至少有这样几块基础:
- 相机成像模型,尤其是针孔相机下世界坐标到像素坐标的变换。
- 点云和运动恢复结构的基本概念,知道稀疏点云和相机位姿是怎么来的。
- 颜色合成的基本直觉,比如alpha混合和画家算法。
- 深度学习优化基础,理解梯度下降和自适应学习率即可。
某个既没有接触过NeRF也没写过光栅化,其实也能读,只需要把1.1里的背景理解为“原来的方案很慢”就够了。3DGS涉及的数学比想象中少很多,真正难的是工程实现里的并行调度和梯度传递,不过这些主要藏在作者的代码里,读论文时不用完全啃下来。
2. 3D Gaussian的核心表示:为什么是椭球而不是体素/网格?
2.1 一个3D高斯椭球的参数和物理含义
先看论文里最基础的定义。一个3D高斯函数可以写作:
G(x) = exp(-1/2 (x-μ)ᵀ Σ⁻¹ (x-μ))
其中μ是高斯中心在世界空间的位置,Σ是协方差矩阵,决定这个高斯在三个方向上的伸展程度和朝向。在3DGS里,每个高斯还额外带两个属性:不透明度α,以及一个用球谐系数表达的颜色c。
直观上可以把每个高斯理解成空间里一团“雾气”:中心最密,越往边缘越淡。训练完成后,这些雾团会密密麻麻地贴在场景表面附近,有的负责墙面,有的负责桌角,有的负责树叶缝隙。渲染时,多个雾团沿着视线叠在一起,前面的挡住后面的,通过alpha混合形成最终的像素颜色。
为什么不直接用体素网格?网格的分辨率是死的,高分辨率网格能表达细节但显存爆炸,低分辨率网格又糊成一片。3DGS的椭球是连续函数,数量不需要绑定到固定分辨率,而且每个椭球可以任意旋转、拉伸、缩放,天生适合表达墙面这种扁平面和电线这种细长结构。
2.2 协方差矩阵为什么要拆成旋转和缩放
如果你直接让模型去优化一个3×3矩阵Σ,会遇到一个麻烦:任意3×3矩阵不一定是对称半正定的,而协方差矩阵必须满足这个性质。训练过程中一旦参数更新让矩阵变得不合法,整个场景的重建就会出问题。
论文的做法是把这个矩阵参数化成:Σ = R S Sᵀ Rᵀ
其中R是旋转矩阵,由四元数表示;S是对角缩放矩阵,由一个三维缩放向量表示。这个分解的几何含义很清晰:一个任意朝向的椭球,可以看成“先确定主轴方向,再沿着三个主轴方向各自拉伸不同比例”。旋转只负责姿态,缩放只负责大小和形状,二者互不干扰。
我最初读到这里的时候没太在意,后来复现时才明白这个参数化有多关键。直接优化椭圆形状的观感并没有多好,更关键的是优化稳定性。四元数只有4个参数,缩放向量只有3个参数,加起来7个数比9个数的矩阵紧凑得多,而且只要在更新后给四元数做归一化,旋转变换就不会产生非预期的扭曲。
这里还有一个容易踩的细节:初始协方差不能设得太大,否则所有高斯一开始就糊成一大片,训练初期会出现大量互相遮挡的半透明“浓雾”,梯度信号会非常混乱。论文用SfM点云初始化时,会根据每个点周围最近邻的距离来估算初始缩放尺度,相当于让初始椭球的大小和点云密度匹配。
2.3 颜色为什么是“RGB+球谐系数”,而不是单一RGB
如果每个高斯只有单一RGB颜色,重建静态漫反射场景没有问题,但真实场景里有高光、墙面反射、玻璃边缘等视角相关效果。同一个位置从不同角度看,颜色是不一样的。这种方向相关性用一个固定RGB表达不了。
3DGS的选择是用球谐函数(Spherical Harmonics)近似方向相关的颜色。球谐函数是一组定义在球面上的基函数,用一组系数就能表达一个随方向缓慢变化的函数。论文默认使用3阶球谐,每个颜色通道对应16个系数,三个通道加起来一个高斯有48个颜色相关参数。其中第0阶系数就是平均颜色,相当于漫反射底色,其余高阶系数负责视角变化带来的明暗和色调偏移。
我刚开始还纠结一个问题:为什么不用更高阶的球谐?答案很简单,代价不成比例。更高阶的SH能表达更锐利的反射,但参数数量暴增,训练时对视角采样也更敏感。实际场景里大多数材质的方向变化都是低频的,比如墙面、布料、树木、地面,3阶SH已经足够。真正需要镜面级反射的地方,这个方案本身就不是最优解,这也是3DGS后续在特定场景下的短板之一。
2.4 和常见场景表示的一段对比
如果把这几种表示方式放在一张表里,会看得更清楚:
| 表示方式 | 优点 | 主要问题 |
|---|---|---|
| 体素网格 | 结构直观、查询快 | 显存随分辨率立方增长,固定分辨率难表达多尺度细节 |
| 神经隐式场(NeRF) | 连续、平滑、紧凑 | 按光线积分,训练和渲染都慢 |
| 点云 | 简单、灵活 | 无法表达连续表面和遮挡关系,渲染质量粗糙 |
| 3DGS | 显式可编辑、光栅化快、基元数量动态调整 | 需要SfM点云初始化,几何提取不如隐式表面 |
换句话说,3DGS选了一条最像“粒子系统”的路。每个高斯不是数学上的一个点,而是一个有朝向、有体积衰减的椭球。它既能像点云一样自由增删,又能通过体积叠加表达连续表面,这是它能在速度和质量的夹缝里找到平衡的根本原因。
3. 从3D到2D:可微分光栅化在算账上做了哪些关键取舍
3.1 3D高斯投影成2D椭圆后如何计算像素贡献
渲染场景时,每个3D高斯都要被投影到图像平面上。投影后,一个3D椭球在像素坐标系里近似对应一个2D高斯。
具体流程是:先用视图矩阵把世界坐标变换到相机坐标系,再考虑针孔相机的透视投影。透视投影本身不是线性变换,但作者用雅可比矩阵J对投影做了局部线性近似。于是投影后的2D协方差可以写成:
Σ' = J W Σ Wᵀ Jᵀ
其中W是视图变换矩阵,J是透视投影的线性近似。因为Σ是实对称矩阵,得到的Σ'也是对称的,可以直接用它计算2D高斯在像素位置处的密度值。
拿到每个像素上2D高斯的密度之后,还需要乘上这个高斯自身的不透明度α,得到最终的alpha贡献。然后把所有覆盖这个像素的高斯按深度从近到远排列,用alpha混合公式累加颜色:
C = Σᵢ cᵢ αᵢ ∏ⱼ<ᵢ (1-αⱼ)
你可以把它理解成一块块半透明玻璃从远处到近处叠加:远处玻璃先垫底,近处玻璃叠上去,透明度决定它“遮挡”多少后面的颜色。
这个流程和NeRF最大的区别在于:NeRF要对一条光线上的几十个采样点做积分才能得到一个像素的颜色,3DGS只需要把当前视角下少数几个真的覆盖到这个像素的2D高斯挑出来做叠加。计算量完全不在一个量级。
3.2 深度排序:为什么按椭球中心排而不是严格沿视线积分
刚接触3DGS时,我马上冒出一个疑问:高斯基元是半透明的,严格来说所有半透明物体混合前都要做正确的深度排序,alpha混合的结果依赖顺序。但3DGS的方案是按高斯中心到相机的距离排序,这显然不是“在视线方向上对每个点做体积积分”的严格处理。
作者的处理方式是:把图像划分成16×16像素的tile,每个3D高斯在投影后先计算它覆盖了哪些tile,然后在每个tile内部按高斯中心深度排序,接着逐像素做alpha混合。
为什么可行?关键在于高斯函数的衰减特性。密度从中心向外迅速下降,所以决定一个椭球“挡不挡得住后面”的主要贡献来自它中心所在的深度。即便在某个像素上,高斯边缘的部分可能和另一个高斯的中心深度产生轻微交叉,视觉上影响也非常小。这种近似换来的好处是巨大的:排序可以在独立的tile内并行做,sort的数据量被控制得很小,GPU并行效率极高。
这很像画家算法的3D版本:先画远的,再画近的,近的覆盖远的。只不过每个“笔触”是半透明的,后面的层还能透出来一点点。
3.3 可微分光栅化器的两个关键点:前向快、反向能传梯度
如果你只是把一串高斯基元按顺序画到屏幕上,这算不上新技术,传统光栅化早就做到了。3DGS真正的难点在于训练:图像Loss算完之后,怎么把梯度精确地传回每个高斯的坐标、协方差、不透明度和球谐系数?
论文里实现了专门的可微分光栅化器。前向只做一件事:把每个像素处的2D高斯值用解析公式算出来,再参与alpha混合,整个过程和普通光栅化一样快。反向则要复杂得多,它需要计算最终像素颜色对这些参与混合的高斯参数的偏导数,而且还得是GPU并行的,不然训练速度会被反向传播拖垮。
这给我一个很深的感受:3DGS在论文里看起来是“表示创新”,但真正让它work的是这个工程上极其扎实的CUDA光栅化器。没有这个可回传梯度的光栅化器,后面所有自适应增删基元的策略都没有训练信号可用。
训练过程中,每一轮迭代就是:把所有当前存在的椭球渲染成图,算和真图的L1+SSIM损失,反向传播更新参数,再按策略控制基元密度。标准的深度学习循环,只是把网络换成了光栅化器,把隐式空间换成了显式椭球列表。
4. 自适应密度控制:让场景精度上台阶的发动机
4.1 初始化和相机位姿从哪来
3DGS不是一个从零开始“生成”场景的算法,它需要一个比较靠谱的起点。论文用的是运动恢复结构(SfM)得到的稀疏点云:先对多视角图像做特征匹配,恢复每张图的相机位姿,同时生成一批稀疏三维点。这些点直接作为高斯中心的位置初始化。
为什么非得用SfM点云?因为相机位姿是所有后续优化共同依赖的坐标基准,没有位姿,模型连“哪个像素和哪个三维点对应”都算不出来。稀疏点云则相当于给场景铺了一层“种子”,让高斯从一开始就分散在真实表面附近,优化过程只需要在种子附近微调、裂变、增删,而不是从一片虚空里长出完整的场景。
如果输入是合成数据,相机位姿可以渲染时直接导出,不需要跑SfM。但真实场景几乎都绕不开这一步,这也是复现3DGS时最容易被卡住的第一道坎。
4.2 克隆、分裂、剪枝:密度控制的三个动作
固定数量的高斯基元有一个根本问题:场景复杂度不均匀。一面白墙可能几十个高斯就够,一棵树需要几万个。如果数量固定,要么细节糊成一片,要么大量基元浪费在空区域。
3DGS的训练过程中会对基元密度做动态管理,三个核心动作是克隆、分裂和剪枝。
克隆发生在场景“欠重建”时。如果一个高斯覆盖的区域细节不够,它的位置梯度会持续指向某个方向,系统就复制一份放在旁边,让局部基元密度提高。
分裂发生在“过重建”时。如果一个高斯尺度太大,把差异很大的区域都包进去了,比如一个椭球横跨了墙面和墙角,系统会把一个大椭球拆成两个小椭球,拆开后它们各自承担更小的空间范围,表达细节的能力更强,但数量会增加。
剪枝相对直接:那些不透明度低到接近0的高斯,几乎不再参与颜色贡献,却仍在排序和混合流程里占用计算资源。系统每隔一段时间就把这类“幽灵基元”删掉,让模型集中算力在真正可见的结构上。
我后来在训练日志里看高斯基元数量曲线,发现它并不是单调上升的:早期快速增,中后期有增有减,最后趋于稳定。这个曲线本身就是理解3DGS的钥匙。如果数量一直不涨,说明欠重建;如果数量暴涨不收敛,大概率是初始化出了外点或者学习率失衡。
4.3 不透明度重置:防止模型卡在局部最优
除了克隆和剪枝,论文里还有一个容易被忽视的技巧:不透明度重置。训练过程中,会有一些高斯基元被放到非常尴尬的位置,既贡献不出有效颜色,透明度又低到几乎不影响画面,但它们会一直占据排序队列位置。系统会定期把部分高斯的不透明度重置一下,给它们重新参与表达的机会。
这个操作在我第一次看训练loss曲线时吓了一跳:每过一定步数,loss会突然跳一下,然后又继续下降。我当时以为代码跑错了,后来才意识到这是不透明度重置导致的正常现象。它的实际效果是防止模型过早地放弃某些区域,让优化过程有机会重新安排基元分布。
如果把这个机制和剪枝放在一起看,会发现3DGS的密度控制其实是一个“买入—卖出—洗牌”的闭环:买入是新克隆/分裂出的基元,卖出是剪掉无效基元,洗牌是把卡住的基元重新激活。
4.4 损失函数与优化细节
3DGS的损失函数很简单,没有复杂的正则项:
L = (1-λ) L1 + λ L_D-SSIM
其中λ通常取0.2。L1负责像素级别的绝对误差,SSIM负责局部结构相似性。两个损失混合是图像合成任务里的常规操作,L1太“硬”,容易丢失高频细节;SSIM太“软”,单独用容易让颜色整体偏移。两者搭配之后,训练过程明显更稳定。
优化器用的是Adam,但不同参数的学习率是分开设置的:位置、旋转、缩放、不透明度、球谐系数各自有独立的机制。位置学习率会随训练步数衰减,因为训练前期需要基元大范围移动去贴合场景结构,后期则应该做局部微调,避免已经收敛的基元到处乱跳。
训练默认迭代几万步,每一步只渲染一次当前所有高斯,算完loss就回传。因为渲染速度快,每一步的代价都很低,所以整个训练过程通常只需要几十分钟,和NeRF动辄按小时计的训练成本形成鲜明对比。
5. 复现3DGS的实操记录:环境配置、参数调优与踩坑清单
5.1 环境准备与数据格式转换
复现3DGS的第一步不是调参数,而是把环境搭对。这个项目依赖GPU并行计算扩展,光栅化器需要本机编译,最常见的坑就是CUDA版本、编译工具链和Python环境互相不兼容。我建议先跑通官方自带的Demo场景,确认从编译到渲染全链路正常,再换自己的数据。
真实场景的数据准备分为两步:先用SfM工具恢复相机位姿和稀疏点云,再把结果转成项目约定的格式。这里有个容易忽略的细节:SfM生成的点云里往往包含外点和离群点,有些来自特征匹配错误,有些来自场景边缘的误匹配。不清理直接拿去初始化,训练时这些外点会把高斯带到场景外或者悬浮在半空中,后期很难靠梯度回传把它们拉回来。
我现在的习惯是:跑完SfM先看一眼点云,手动剔除远离主体的离散点,再把点云导入3DGS的初始化流程。这个步骤花不了几分钟,但能让训练稳定性上一个台阶。
5.2 训练参数与显存、时间的平衡
论文的默认超参数在绝大多数常见场景里都能得到不错的结果,不太需要从零调参,但有几个变量在实际项目中值得关注:
| 可调项 | 常见做法 | 主要影响 |
|---|---|---|
| 训练图像分辨率 | 原图过大时适当降采样 | 直接决定显存压力,也影响细节上限 |
| 初始点云密度 | SfM点云稀疏时可先补密 | 影响训练收敛速度和最终细节 |
| 最大基元数量上限 | 显存紧张时设置 | 防止显存溢出,但可能损失细节 |
| 剪枝与重置间隔 | 保持默认 | 改动过大容易让loss振荡 |
显存不足时,我一般优先降低图像分辨率,而不是强行削减基元数量。降分辨率对整体结构的重建影响不大,但基元数量砍得太狠会让细节直接丢失。训练中段的显存占用会随基元数量增长,复杂场景上百万个高斯并不稀奇,所以保存模型文件时也要预留足够的磁盘空间。
训练时长的参考值:在常见高配显卡上,一个一两百张图的室内场景,跑完默认迭代步数大约几十分钟。如果想快速验证效果,可以先用一个几十张图的小场景,把全流程跑通,再决定是否上大场景。
5.3 我实际遇到的几个坑及排查思路
复现过程中,我踩过的坑大概可以归成下面几类。
第一个坑是训练刚开始就看到大量高斯飞到相机附近或场景外面。排查思路是先检查SfM点云:如果点云本身包含外点,初始化就会带病运行。另外,初始协方差也不能设得过大,否则高斯起步就变成“弥天大雾”,梯度信号混乱,收敛速度骤降。
第二个坑是大片无纹理区域出现“一层雾”。白墙、地面、天空这类区域SfM本身的点很稀疏,3DGS只能靠少量大尺度的椭球硬撑,视觉上就会出现一种半透明的雾感。我的处理办法是适当增加初始点云密度,同时允许训练过程中产生足够多的分裂操作。但也要接受一个事实:在无纹理区域,3DGS不一定比NeRF更干净。
第三个坑是渲染结果整体偏灰或偏暗。这种情况多半不是模型问题,而是数据问题。先检查图像分辨率、颜色空间和相机位姿是否严格匹配,再考虑真实场景里是否有曝光不一致的照片混入。3DGS把颜色差异全归因到球谐系数和高斯颜色上,如果输入图本身亮暗不一致,模型会试图用“奇怪的系数”去平衡,最终观感就会变脏。
第四个坑是显存中途溢出。常见触发条件是场景太大、分辨率太高、基元数量涨得太快。解决方案是初始降分辨率、控制初始点数量、设置基元上限。注意不要在训练中途随意改损失权重或者调整剪枝间隔,否则前面白跑,后面也未必能救回来。
第五个坑是评估指标很好看,但目测效果很糟糕。L1和SSIM都是全局指标,几个区域的局部漂浮“幽灵基元”可能对数值影响不大,但人眼一眼就能看出来。我建议训练结束后导出一段环绕渲染视频,一帧一帧过一遍,同时检查一下基元的空间分布,比单纯依赖指标更有说服力。
5.4 快速判断一个场景适不适合用3DGS
不是所有场景都适合同一条路。我的建议是先拿一个小场景做试探:几十张图,跑通数据准备和训练流程,观察最后基元数量和视觉效果。如果小场景在同分辨率下已经明显吃力,比如墙面模糊、边缘碎裂、漂浮物很多,那大场景直接放大问题只会更麻烦。
如果手里只有不到十几张图,或者图像之间视角差异极大,3DGS的显式表示缺乏隐式先验的约束,很容易出现过拟合。这种情况我更推荐先考虑基于神经隐式场的方法,或者干脆先补拍一些覆盖更充分的图像。
6. 3DGS对照NeRF全家桶:优势、局限和适用场景判断
6.1 与主流的NeRF和显式体素方案对比
在完整跑通3DGS之后再回头看NeRF系列,我对这两条路线的优劣有了更具体的感知。一张表格归总一下我的理解:
| 维度 | 传统NeRF | 加速体素/哈希方案 | 3DGS |
|---|---|---|---|
| 场景表示 | 神经网络隐式场 | 网格+哈希特征 | 显式高斯椭球 |
| 训练时长 | 数小时 | 十几分钟量级 | 几十分钟量级 |
| 渲染速度 | 秒级甚至更低 | 可达实时或接近实时 | 实时(上百帧) |
| 显存占用 | 低 | 随分辨率快速膨胀 | 与基元数量正相关 |
| 可编辑性 | 较差 | 一般 | 高,椭球可增删改 |
| 几何提取 | 可隐式转网格 | 可隐式转网格 | 需要额外后处理 |
总的来说,3DGS的最大卖点是训练完成后可以像普通3D模型一样实时浏览,这在项目交付、沉浸式预览、虚拟制作这些场景里价值巨大。NeRF的强项则在于连续性和先验,尤其是数据不充分时更不容易崩。
6.2 3DGS的明显短板
即便3DGS效果惊艳,它也有几块明显的短板,选型时需要提前想清楚。
第一,几何精度。高斯椭球只是“场景外观的载体”,没有明确的表面定义。如果你要提取精确的Mesh用于测量、机械设计或者制造,3DGS的原始输出并不友好,需要借助额外手段把椭球集合转成密度场再做表面提取,精度和可控性都比基于SDF的方案差一些。
第二,稀疏视角下的稳定性。3DGS的显式基元完全由梯度驱动增减,缺少NeRF那种空间平滑性先验。当视角数量很少时,它可能学出非常诡异的结构来硬凑匹配,而NeRF凭借隐式连续性反而不容易走形。
第三,动态场景。论文原生只处理静态场景,运动物体、时间变化都需要额外扩展方案。后续确实有很多动态3DGS的改进,但每一步扩展都伴随着更多的约束和更大的工程复杂度,不是开箱即用。
第四,反射和折射。低阶球谐函数表达不了清晰的镜面反射。玻璃、金属、水面这类材质在3DGS里容易被糊成一片,除非额外加入反射分解模块,否则效果不如基于光线追踪的传统方法。
第五,大场景扩展性。基元数量上去之后,排序、显存、渲染负担都会同步上涨。室外街道、整栋建筑这类大规模场景需要配合分块处理、LOD和稀疏化策略,原生实现并不能直接无缝支撑。
6.3 我的选型建议
在实际项目里选哪条路,不能只看论文里的指标对比,要看你的交付物到底是什么。
如果目标是从图像重建出可实时浏览、可编辑的三维内容,比如线上展品、虚拟拍摄场景、三维场景漫游,3DGS是目前性价比最高的入口,没有之一。训练速度能接受,渲染质量能打,导出结果能直接交互,这一套流程非常适合产品原型和中期交付。
如果目标是精细的CAD级表面重建,或者输入图像少到只有个位数,那还是优先考虑基于SDF的神经重建方案,或者经典的多视角立体几何管线。3DGS在“视觉真实感”上很强,在“几何精确度”上并不是它的主场。
如果未来要做动态重建,可以关注动态高斯方向的扩展工作;如果是室外大场景,需要额外考虑分块和管理策略。总之,3DGS不是终点,但它实实在在把“实时辐射场渲染”从愿景变成了工具,让后续大量应用得以在它肩上生长。
最后说一点我自己的体会。读这种论文,光看公式和示意图很容易“假懂”:投影协方差、自适应密度控制好像都理解了,但一上手复现还是会崩。我建议你第一次完整跑通后,把训练中间输出的基元点云导出来看一眼。你会直观看到克隆和分裂到底把基元放到了哪里、剪枝把哪些“幽灵”清掉了,比盯着loss曲线有用得多。这是我踩过几次坑反而顿悟最多的地方,3DGS不是魔法,它只是一套非常聪明的、由梯度驱动的显式基元系统。