ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CT重建(二) | 3D高斯泼溅:实时渲染的革命

CT重建(二) | 3D高斯泼溅:实时渲染的革命 3D Gaussian Splatting 项目详解仓库graphdeco-inria/gaussian-splattingInria GRAPHDECO 官方实现论文3D Gaussian Splatting for Real-Time Radiance Field RenderingSIGGRAPH 2023, ACM TOG目录项目介绍它解决了什么问题NeRF 是怎么做的输入从多视角照片到相机与点云COLMAP / SfM 是什么模型表示3D 高斯是什么训练过程渲染 → 比对 → 反传密度控制哪里放高斯哪里不放渲染核心splat / tile / 排序 / alpha 混合 / 可微光栅化为什么方向相反还能重建为什么又快又好输出与推理代码地图与关键参数学习路径NeRF 与 3DGS 的技术栈对比1. 项目介绍这是论文3D Gaussian Splatting3DGS的官方实现。一句话输入一批从不同角度拍摄的照片重建出一个可以实时渲染任意新视角的三维场景。它的效果直观理解是训练完成后你可以像玩 3D 游戏一样在场景里自由移动视角实时看到画面。整个流程只有四步拍照片多视角照片用 COLMAP / SfM 做相机标定得到相机参数和稀疏点云用这些点云初始化一堆 3D 高斯训练优化这些高斯最后输出一个.ply模型文件2. 它解决了什么问题在 3DGS 出现之前主流是新视角合成Novel View SynthesisNeRF / Mip-NeRF360画质高但极慢1080p 通常不到 1 fps训练要几十小时Plenoxels / InstantNGP更快但画质有损失且在无界大场景 1080p下仍做不到实时核心矛盾「快」和「好」长期不可兼得。论文原话对于无界完整场景而不是孤立物体的 1080p 渲染之前没有任何方法能实时。3DGS 的目标就是同时拿到高画质 实时渲染 较短训练时间。而它达成的关键是三个设计后面各节逐一展开用3D 高斯做显式场景表示而不是神经网络交错的优化 / 密度控制自适应增删高斯可见性感知的快速可微光栅化替代逐光线体渲染积分3. NeRF 是怎么做的要理解 3DGS 的取舍必须先把 NeRF 讲透。这一节从头讲一遍 NeRF 的完整原理。3.1 核心思想用一个函数表示整个场景NeRFNeural Radiance Field神经辐射场的核心假设是整个三维场景可以用一个连续的数学函数来描述。这个函数是F(x, y, z, θ, φ) → (σ, r, g, b)输入空间中一个 3D 点的坐标(x, y, z)加上一个观察方向(θ, φ)单位方向向量d输出σ该点的体积密度有多不透光(r, g, b)该点朝这个方向看过去的颜色NeRF 用一个MLP多层感知机来拟合这个函数。训练完成后网络权重里就「装下了」整个场景。关键点这是一个隐式表示——场景没有显式的几何形状你无法直接从网络里拿出来一个「物体」只能通过查询函数得到某个位置的信息。3.2 渲染从像素发射光线渲染一张图时NeRF 对每个像素做下面这套流程① 生成光线用相机内外参从像素(u, v)和相机光心o出发确定一条光线r(t) o t · d其中d是归一化的射线方向t是沿光线的距离参数近端t_near到远端t_far。② 沿光线采样在[t_near, t_far]之间取N个采样点t₁, t₂, ..., t_N。原始 NeRF 用粗网络 细网络两级采样先均匀粗采样再根据粗网络的密度分布在「可能有物体」的地方细采样重要性采样InstantNGP 等后续工作改用哈希网格加速查询但思路一样还是要沿光线取很多点③ 位置编码Positional Encoding直接把(x, y, z)喂给 MLP 会导致网络偏向学习低频模糊结果。所以 NeRF 先把坐标映射到高维γ(p) (sin(2⁰πp), cos(2⁰πp), sin(2¹πp), cos(2¹πp), ..., sin(2^{L-1}πp), cos(2^{L-1}πp))这一招让 MLP 能表达高频细节纹理、边缘。位置用L10方向用L4。④ MLP 前向F_Θ( γ(x), γ(d) ) → (σ, c)网络通常是 8 层全连接 ReLU宽度 256σ只依赖位置γ(x)因为密度是几何属性与观察方向无关c依赖位置 方向把方向拼接到中间层特征上这样能表达镜面反射等视角相关效果⑤ 体渲染积分得到沿光线的N个(σᵢ, cᵢ)后用经典的体渲染公式合成像素颜色C Σᵢ Tᵢ · (1 - exp(-σᵢ δᵢ)) · cᵢ Tᵢ exp( - Σ_{ji} σⱼ δⱼ )其中δᵢ是相邻采样点的间距。直觉解读αᵢ 1 - exp(-σᵢ δᵢ)是第i个点的不透明度密度越高、间距越大越不透明Tᵢ是透光率光从相机走到第i个点还没被前面挡掉的比例所以C就是「每个点贡献自己的颜色 × 自己的不透明度 × 前面剩下的透光率」的加权和这和 3DGS 的 alpha 混合公式本质完全一样只是 NeRF 的点是沿光线采样出来的3DGS 的点是空间中的高斯。⑥ 计算损失并反传L Σ_pixels ‖ C_render - C_gt ‖²梯度反传回 MLP 权重更新网络。因为整套流程可微所以能端到端训练。3.3 为什么 NeRF 慢把上面的流程算一下成本一张 1080p 图像 ≈ 200 万像素每个像素一条光线每条光线采N个点原始 NeRF 是 64 粗 128 细 192 个点每个点都要跑一次完整的 MLP 前向8 层 × 256 维结果渲染一张图需要约 4 亿次网络前向的量级。这就是它慢的根本原因——不是实现不好而是「逐像素 × 逐光线 × 逐点查网络」这个结构本身的计算量太大。而且还有个浪费光线穿过空白区域天空、空气时照样要采样、照样要查网络但这些点对最终颜色几乎没有贡献。4. 3d高斯泼溅输入从多视角照片到相机与点云训练需要三类输入它们分别负责不同的事情数据回答的问题在 3DGS 中的作用外参 (R, T)相机在哪、朝哪决定「从哪个视角渲染」内参 (fx, fy, W, H)如何投影成像决定「3D 点落到哪个像素」稀疏点云场景大概长什么样决定「高斯从哪里开始、初始多大」为什么会需要这三样因为 3DGS 的训练本质是一个循环用相机参数把 3D 高斯投影成 2D 图像 → 和真实照片比对 → 反传修正高斯没有外参 → 不知道该渲染哪个视角损失无从计算没有内参 → 不知道 3D 点该落在哪个像素渲染尺寸对不上没有点云 → 只能随机初始化优化更难收敛4.1 内参与外参用针孔相机模型来理解投影公式像素坐标 p K · [R | T] · 世界点 P外参[R | T]R旋转 T平移描述相机在世界坐标系中的位姿。代码里getWorld2View2utils/graphics_utils.py:38把世界坐标转到相机坐标。内参K焦距fx, fy和图像宽高W, H。代码把它们换算成视场角utils/graphics_utils.py:73focal2fov(focal, pixels) 2 · atan(pixels / (2 · focal))焦距越大 → 视场越窄 → 物体投影越大注意3DGS 只支持PINHOLE/SIMPLE_PINHOLE这两种无畸变的相机模型scene/dataset_readers.py:88-97。带畸变的模型RADIAL、OPENCV 等会直接报错必须先让 COLMAP 去畸变。4.2 稀疏点云COLMAP 输出的points3D每个点只有XYZ 坐标 RGB 颜色它不是高斯的全部参数。剩下这些参数是 3DGS 初始化时构造出来的scene/gaussian_model.py:119create_from_pcd高斯参数初值来源位置_xyz直接用点的 XYZ颜色点 RGB 转成球谐的 DC 项RGB2SH尺度_scaling到最近邻点的距离distCUDA2点密则小、点疏则大旋转_rotation单位四元数无旋转不透明度_opacity固定初值 0.1协方差 Σ由尺度和旋转算出不是直接给的所以准确说法是COLMAP 点云提供高斯的「出生位置和基础颜色」其余参数是构造出来的再靠训练优化。5. COLMAP / SfM 是什么COLMAP是一个开源的摄影测量 / Structure-from-MotionSfM工具。给它一堆从不同角度拍同一场景的照片它反推出每张照片拍摄时相机在哪、朝哪外参相机的焦距 / 成像特性内参场景中一批稀疏的三维点点云这正是 3DGS 需要的全部输入。5.1 名字的含义Structure结构场景的三维结构Motion运动拍摄时相机的运动轨迹from Motion从相机运动中恢复出三维结构5.2 四个步骤特征提取在每张照片里找出特征点角点、纹理丰富的区域。纯色墙、天空提不出特征这也解释了为什么这些地方后来没有高斯。特征匹配找出「照片 A 的哪个点和照片 B 的哪个点是同一个三维点」。稀疏重建用三角测量算出三维点坐标用光束法平差Bundle Adjustment联合优化相机位姿和三维点。稠密重建MVS可选3DGS不需要这一步它只用稀疏点云。5.3 输出目录结构scene/ images/ # 去畸变后的照片 sparse/0/ cameras.bin - 内参焦距、分辨率、相机模型 images.bin - 外参每个相机的 R 旋转、T 平移 points3D.bin - 稀疏三维点XYZ RGB高斯的初始位置对应代码scene/dataset_readers.py:144读取。5.4 验收标准判断 COLMAP 跑得好不好注册的相机数量是否几乎覆盖所有照片重投影误差一般应 1 像素点云密度和分布是否覆盖场景主要结构6. 模型表示3D 高斯是什么6.1 先理解 NeRF 在做什么NeRF 的网络输入是空间中任意一个 3D 点的坐标 一个观察方向F(x, y, z, θ, φ) → (密度 σ, 颜色 c)也就是给它空间中任意一点它告诉你「这里有多不透光、朝某方向看是什么颜色」。注意两个常见误解❌ NeRF 的输入不是「带位置的图片」也不是 2D 像素❌ NeRF 的输出不是直接的 2D 像素颜色渲染时是从像素发射一条光线在光线上采样很多 3D 点逐点查网络再积分算出像素颜色。慢的根本原因每个像素 → 发一条光线 → 沿光线采样几十上百个点 → 每个点跑一次 MLP 前向 → 再做体渲染积分。1080p 有 200 万像素量级巨大。可以用一个类比想象空间里弥漫着一层半透明的彩色雾每个位置的浓淡σ和颜色c由网络定义。NeRF 学的是这层「雾」的函数。6.2 3D 高斯是什么3DGS 不再用「连续函数 逐点采样」而是直接在空间里放很多个半透明的椭球高斯球。可以想成空气中悬浮的、可长可扁、可调朝向的彩色糖豆。每个高斯的属性scene/gaussian_model.py位置 μ中心在哪 (x, y, z)协方差 Σ形状。由缩放 S 和旋转 R 决定Σ R S Sᵀ Rᵀ缩放让它能变椭球、能各向异性拉长旋转让椭球朝向任意方向——这是它能贴合薄面、细结构的关键不透明度 α这颗糖豆有多「实」介于 0~1颜色用球谐系数SH表示能随视角变化出不同颜色镜面反光等6.3 高斯为什么是「连续」的单个 3D 高斯本身就是一个连续函数G(x) exp( -½ (x - μ)ᵀ Σ⁻¹ (x - μ) )离中心越近值越大向外平滑衰减。关键点所以 3DGS 依然是连续的、可微的表示不是离散体素——这正是它能保留 NeRF 那种「可微体渲染、能优化」优点的原因。区别只在计算方式NeRF 沿光线密集采样、逐点查网络3DGS 把每个高斯直接投影到屏幕变成 2D 椭圆只对覆盖到的像素加权混合6.4 3D 高斯与 NeRF 的关系两者描述的是同一件事——空间的密度和颜色场——只是形式不同NeRF3DGS形式隐式存在网络权重里显式一颗颗高斯叠加查询必须过一遍 MLP直接读参数元素操作无法直接查看/编辑可逐个增删、移动某个位置的「密度」≈ 该点落进各个高斯内部的概率之和某方向的「颜色」≈ 各高斯加权平均。7. 训练过程渲染 → 比对 → 反传主循环在train.py:80每次迭代随机抽一张训练相机train.py:96渲染用render()把当前高斯投到该视角得到渲染图、可见性掩码、2D 半径、深度算损失train.py:122L (1 - λ) · L1 λ · (1 - SSIM)默认λ 0.2。直觉L1 保证像素级准确SSIM 保证结构相似。如果启用深度正则化再加一项逆深度 L1。反传loss.backward()用 Adam 更新所有高斯参数密度控制增删高斯见下一节位置的学习率按指数调度逐步衰减get_expon_lr_func另外球谐阶数每 1000 步升一级gaussian_model.py:113oneupSHdegree逐步提升对视角相关外观的表达能力。8. 密度控制哪里放高斯哪里不放短答不是所有区域都铺高斯。高斯只出现在有内容的地方靠训练中动态增删实现。8.1 初始化已经在筛了create_from_pcd只在 COLMAP 的稀疏点上创建高斯而这些点本身只存在于有纹理、可匹配的地方。天空、纯色墙、玻璃这类无特征区域COLMAP 根本不出点初始就没有高斯。如果是 Blender/NeRF 合成数据没有点云程序会随机撒 10 万个点dataset_readers.py:296——这是被迫「全区域铺」效果通常更差。8.2 训练中的增删规则核心是densify_and_prunegaussian_model.py:392在densify_from_iter默认 500 步到densify_until_iter默认 15000 步之间每 100 步执行一次。加克隆 / 分裂——判据是屏幕空间位置梯度梯度大说明「这里没拟合好」梯度 ≥densify_grad_threshold默认 0.0002→ 候选候选里高斯小 → 克隆就地复制一份增加局部密度候选里高斯大 → 分裂拆成 2 个更小的提高分辨率「大/小」的界max(scaling) percent_dense · scene_extent默认percent_dense 0.01减剪除——三种都没用了就删不透明度太低 0.005几乎透明的废高斯屏幕投影过大 20像素横跨半张图通常是错误的背景解世界尺度过大 0.1 · scene_extent占满场景的超大高斯不透明度重置每opacity_reset_interval默认 3000 步把所有高斯不透明度压到 ≤0.01让「滥竽充数」的高斯在下一轮被剪掉同时给新位置腾出生长空间。这是防止高斯只增不减的关键机制。8.3 结果高斯数量从初始几千个 SfM 点逐步长到几百万个全部集中在有纹理、有细节、重建误差大的地方树叶、栏杆、细纹理而平坦区域、空旷区域高斯很稀疏甚至没有。这就是它比 NeRF 均匀采样更高效的原因——自适应地匹配场景的复杂度分布。9. 渲染核心splat / tile / 排序 / alpha 混合 / 可微光栅化这是整个方案最核心、也最「工程」的部分submodules/diff-gaussian-rasterization。用「往屏幕上撒彩色糖豆」的直觉来理解。① 2D splat把 3D 高斯投到屏幕每个 3D 高斯是空间中的椭球splat就是把它投影到屏幕——3D 椭球投下来还是 2D 椭圆。投影用相机的内外参外参决定从哪看内参决定投到屏幕哪里、多大。投影后得到屏幕上的中心位置、2D 椭圆形状、深度、颜色、不透明度。和 NeRF 最大的区别NeRF 是「从像素射光线出去找点」3DGS 是「从点投到像素上来」。方向反了这是快的第一层原因。② tile 划分把屏幕切成小块屏幕被切成很多个固定大小的正方形 tile如 16×16 像素。每个 splat 只登记到它覆盖的 tile 上。空区域没有任何高斯覆盖对应 tile 完全零计算。同时一个 tile 内像素可并行处理内存访问局部化。③ 深度排序保证前后遮挡关系对同一个 tile 上会有很多 splat 重叠必须按深度从近到远排序再混合。为什么必须排序alpha 混合不可交换。顺序错了近的物体就不能正确遮住远的颜色会算错。例近的红色不透明 1.0远的蓝色不透明 1.0。正确顺序近→远结果 红色顺序反了会得到错误结果。排序本身是为了正确性不是可选项。④ alpha 混合怎么合成一个像素颜色从前到后依次混合公式和体渲染一致C Σᵢ cᵢ · αᵢ · Π_{ji}(1 - αⱼ)直觉每个高斯贡献自己的颜色c权重 自己的不透明度α×「被前面所有高斯挡住后还剩多少透光」。早停early termination当累积不透明度Σα接近 1后面彻底看不见了剩下的高斯直接跳过。注意纠正一个常见误解❌ 不是「先做前面的后面的就不做了」✅ 是「按顺序累积完全不透明后才停」部分遮挡的高斯仍会按不透明度贡献颜色只是贡献很小⑤ 可微光栅化为什么能训练普通图形学光栅化只求「画得快」不可导不能训练。这里每一步投影、混合公式都写成对高斯参数可微的形式。渲染图和真实照片算损失后梯度能反传回每一个高斯的位置、协方差、不透明度、球谐颜色。细节为了让反向传播高效作者把梯度计算放在CUDA kernel 里手写实现而不是靠 PyTorch 自动搭图。这既是它快、也是它能训练的原因。全流程串联3D 高斯集合 │ ① 用相机内外参投影splat ▼ 屏幕上的 2D 椭圆 │ ② 登记到它覆盖的 tile ▼ 每个 tile 一份高斯列表 │ ③ 按深度排序 ▼ 有序列表 │ ④ 从前到后 alpha 混合可早停 ▼ 渲染图像 │ ⑤ 和原图比 loss梯度反传回高斯参数 ▼ 更新位置/协方差/不透明度/颜色 → 下一轮10. 为什么方向相反还能重建这是一个很本质的问题。物理上只有一个方向光从场景到相机。场景中的点 → 发出/反射光 → 沿直线传播 → 穿过小孔 → 打在传感器某个像素上像素是「果」场景点是「因」。光栅化3DGS顺着物理方向走拿着场景点正向投影算出它落在哪个像素。光线追踪 / NeRF 逆着物理方向走从像素反向发射光线回溯它「当初是从场景哪个点来的」。所以「方向相反」不是两件不同的事而是同一条直线从两端各看一眼。数学上是一对手性相反的变换正向3DGS世界点 → 像素。确定性投影。反向NeRF像素 → 射线。深度未知所以才要沿光线采样很多点靠体渲染积分「猜」深度。重建能成立的核心多视角约束 可微优化。同一个真实 3D 点在多个视角的投影必须一致。3DGS 直接假设场景由一堆高斯构成投到某视角和照片比对哪里不对就调整高斯。训练时随机换不同视角每个视角都是对「同一批高斯」的一个约束。几十上百个视角一起约束高斯就被逐步逼到正确解。就像从不同角度给一个物体拍照虽然每张都是 2D但把多张放一起形状就被「夹」出来了。一句话方向只决定计算路径不决定能否重建重建依据的是「多视角一致性 可微优化」。11. 为什么又快又好快的原因表示显式没有网络前向直接读高斯参数只算有内容的地方空区域没有高斯零开销NeRF 在空空间照样采样光栅化 tile 并行GPU 天然适合比串行逐光线高效早停完全遮挡后跳过剩余高斯CUDA 手写 kernel前向反向都高度优化好的原因避免空区域伪影只在高斯存在处渲染边界更锐利能表达高频细节自适应增密 各向异性拉长细结构表达力强保留体渲染优点alpha 混合等价于体渲染离散化可微、可优化无界完整场景第一次在 1080p 无界场景下做到画质领先且实时权衡诚实说明显存占用大几百万个高斯训练需 24GB 级别显存显式表示文件体积比 NeRF 的 checkpoint 大但换来可直接光栅化、易编辑剪裁、变形、组合依赖初始点云质量SfM 失败的区域难以补全无纹理区域容易空洞或模糊12. 输出与推理训练完成后最重要的产物output/id/point_cloud/iteration_XXX/point_cloud.ply3D 高斯模型。PLY 里每个点存位置、SH 颜色系数、不透明度、缩放、旋转gaussian_model.py:232cameras.json相机参数记录input.ply原始稀疏点云副本exposure.json每张图的曝光参数若启用chkpntXXX.pth训练检查点可续训TensorBoard 日志loss、PSNR 等推理 / 渲染render.py加载训练好的point_cloud.ply对任意新视角实时渲染metrics.py计算 PSNR / SSIM / LPIPSSIBR_viewers/提供 OpenGL 实时交互查看器标准命令# 训练python train.py-spath to COLMAP dataset# 训练带评测划分python train.py-spath--eval# 渲染python render.py-mpath to trained model# 计算指标python metrics.py-mpath to trained model13. 代码地图与关键参数代码地图文件 / 目录作用train.py训练主循环render.py训练后渲染metrics.py/full_eval.py评测指标convert.py把自定义图片转成 COLMAP 数据集scene/gaussian_model.py高斯模型定义、优化、密度控制、存取scene/dataset_readers.py数据集读取COLMAP / Blenderscene/__init__.py场景组装相机 点云 高斯gaussian_renderer/渲染封装调用 CUDA 光栅化器submodules/diff-gaussian-rasterization可微光栅化 CUDA 核心submodules/simple-knn最近邻距离初始化尺度用SIBR_viewers/OpenGL 实时查看器arguments/命令行参数定义关键参数默认值参数默认含义--iterations30000总训练步数--sh_degree3球谐阶数≤3--lambda_dssim0.2loss 中 SSIM 的权重--densify_from_iter500开始增密--densify_until_iter15000停止增密--densify_grad_threshold0.0002增密梯度阈值--densification_interval100增密间隔--opacity_reset_interval3000不透明度重置间隔--percent_dense0.01「大高斯」判定比例--position_lr_init0.00016位置初始学习率--position_lr_final0.0000016位置最终学习率14. NeRF 与 3DGS 的技术栈对比这一节把两者的每一层技术选型摊开来对比你能清楚看到 3DGS 是「在哪一层做了什么替换」才换来快和好。15.1 分层对比表层次NeRF3D Gaussian Splatting场景表示MLP 隐式函数显式高斯集合几何原语无靠密度场隐式表达各向异性椭球外观表示MLP 输出颜色球谐系数SH初始状态随机初始化网络权重SfM 稀疏点云渲染原语光线ray高斯splat采样方式沿光线密集采样不需要采样直接在点上算渲染算法光线步进 体积积分光栅化 alpha 混合计算方向像素 → 场景反向场景 → 像素正向加速结构粗/细采样、哈希网格tile 划分、深度排序、早停可微机制框架自动求导手写 CUDA 可微 kernel并行粒度按光线 / 按像素按 tile / 按高斯几何更新权重隐式变化显式克隆/分裂/剪除参数量级网络权重约 MB几百万高斯约百 MB ~ GB15.2 逐层解读① 表示层隐式 vs 显式NeRF 把场景编码进 MLP 权重。优点是紧凑、连续、参数少缺点是每次查询都要算一遍网络且无法直接操作几何。3DGS 把场景摊开成一堆高斯。优点是查询是 O(1) 的常数操作直接读参数且几何可直接增删编辑缺点是存储大、需要显存。② 几何层连续密度场 vs 各向异性几何原语NeRF 没有「几何」这个概念几何是从密度场里「浮现」出来的。高密度区域就是物体但边界模糊且表面靠等值面提取。3DGS 每个高斯自带各向异性协方差RSSᵀRᵀ可以拉成任意朝向的椭球因此能精确贴合薄平面、细杆这类结构。③ 采样层密集采样 vs 无需采样这是快的关键差异NeRF一条光线必须采几十~上百个点每个点都是一次网络前向。3DGS高斯本身就是「点」投影后直接混合没有采样这一步。这是两者计算量差距最大的地方。NeRF 的成本是像素 × 采样点数 × 网络深度3DGS 的成本是高斯数 × 覆盖像素数且有空区域剪枝和早停。④ 渲染层光线步进积分 vs 光栅化混合两者的数学本质一样都是 alpha 合成差别在计算组织方式NeRF 沿光线串行累积虽然能按光线并行3DGS 把高斯投影到屏幕切成 tile按 tile 并行、按深度排序混合后者更贴合 GPU 的并行架构且天然支持早停。⑤ 加速层NeRF 系InstantNGP 用哈希网格 多分辨率特征缓存Mip-NeRF 360 用提议网络proposal network做重要性采样都是为了减少无效采样。3DGStile 划分减少无效高斯处理深度排序保证正确性的同时允许早停空区域天然零成本。⑥ 可微机制层容易被忽略但很关键NeRF整个前向是「光线采样 → 逐点 MLP → 积分」用 PyTorch 自动求导就能反传实现相对简单但显存开销大、速度受限。3DGS光栅化的前向和反向都在CUDA kernel 里手写diff-gaussian-rasterization包括对协方差、球谐的梯度。这让它既快又省显存但实现复杂度高得多。⑦ 几何自适应层NeRF网络容量固定。想让细节更好只能加大网络或提高采样密度无法「局部加密」。3DGS训练中按梯度自适应地克隆/分裂/剪除计算力自动集中到需要的区域这是它画质能超过 NeRF 的重要原因之一。总结3D Gaussian Splatting 并不是对 NeRF 的简单「加速版」而是一次表示层、渲染层与优化层的整体重构。它把 NeRF 中「隐式网络 逐光线密集采样 体渲染积分」这条计算昂贵的路径替换成了「显式高斯集合 正向光栅化 可微 alpha 混合」的高效路径。数学本质仍是体渲染但工程组织方式彻底改变从而第一次在无界完整场景、1080p 分辨率下同时做到了高画质、实时渲染与可接受的训练时间。回过头看3DGS 的成功可以归结为三个关键选择表示显式化用几百万个各向异性 3D 高斯代替 MLP让查询从「跑一次网络」变成「直接读参数」优化自适应通过克隆、分裂、剪除与不透明度重置让计算力自动集中到有纹理、有细节、重建误差大的区域渲染可微化把光栅化的前向与反向都写进 CUDA kernel既保证速度又让梯度能反传回每一个高斯的位置、形状、不透明度与颜色。当然它也有代价显存占用大、模型文件体积大、依赖 SfM 初始点云质量无纹理区域仍容易出现空洞或模糊。但这些问题恰恰构成了后续研究的方向——压缩、稀疏化、鲁棒初始化、动态场景扩展、与网格/神经场的混合表示等。如果说 NeRF 教会了我们「用一个函数描述整个场景」那么 3DGS 则证明了当表示足够显式、渲染足够贴合硬件、优化足够自适应时实时高保真三维重建可以从理想走进现实。
返回列表