篇目 07 · 单篇论文精读

画得好的抽不出网格,抽得出的画不好:一张贴图两头都拿

BillBoard Splatting (BBSplat) · 3DGS 家族摆着两难——立体图元画得细但抽不出网格,平面图元贴合表面能抽网格却画不好;给平面图元贴上一张可学习纹理,形状从纹理里长出来,两头都拿

David Svitov、Pietro Morerio、Lourdes Agapito、Alessio Del Bue Univ. of Genova / IIT / UCL arXiv:2411.08508v4 · ICCV 2025 2025 年 · CC BY
12 章一级章节(按拆解点切)
11 式公式逐步重推,非引用
9 张配图(原文 9 / 自绘 0)
8 条边界与反例(独立成节)

图-段配对表 · 本稿 9 张

图角色档归属支撑的论断层次状态
图 8-1E§1同图元数下背景/平面细节更细;图元越少 LPIPS 优势越大①②③④引用 Fig. 1
图 8-2S§3参数化扩展(b2 双纹理)与渲染路径(c2 纹理采样)总览①②③引用 Fig. 2
图 8-3S§3SH 基础色 + 纹理偏移合成视相关颜色①②③引用 Fig. 3
图 8-4E§7三数据集定性:中心物体持平、背景/平面细节更好④引用 Fig. 4
图 8-5E§8平面图元可直接光栅化;mesh 优于 3D 高斯系(SuGaR)①②③④引用 Fig. 5
图 8-6S§4天空球:SfM 点外围 Fibonacci 均匀采样①②③引用 Fig. 6
图 8-7E§9500→30000 迭代,轮廓从高斯形长成任意形状①②③引用 Fig. 7
图 8-8E§8更多 ray-tracing(重光照/镜面)与提取网格④引用 Fig. 8
图 8-9E§7三数据集各三场景补充定性④引用 Fig. 9
角色档按 20 号票的裁决:E 类(承载可核对数值或作为唯一证据)禁止自绘,故 6 张证据图全部引用;S 类(纯几何/机制示意)允许自绘,本稿 3 张 S 类图(图 8-2 / 8-3 / 8-6)均直接引用原文示意,未走自绘准入。
许可:arXiv 全文非独占分发,本站站内托管并标注 arXiv;接受手稿版本已应用 CC BY public copyright license(见原文出处块)。所有图均为原文截图原样引用、未修改、逐图署名(图号 + 页码 + 版权 + 未修改声明)。
原文摘要 Abstract, p.1(英文原样引用)

"We present billboard Splatting (BBSplat) - a novel approach for novel view synthesis based on textured geometric primitives. BBSplat represents the scene as a set of optimizable textured planar primitives with learnable RGB textures and alpha-maps to control their shape. BBSplat primitives can be used in any Gaussian Splatting pipeline as drop-in replacements for Gaussians. The proposed primitives close the rendering quality gap between 2D and 3D Gaussian Splatting (GS), enabling the accurate extraction of 3D mesh as in the 2DGS framework. Additionally, the explicit nature of planar primitives enables the use of the ray-tracing effects in rasterization. Our novel regularization term encourages textures to have a sparser structure, enabling an efficient compression that leads to a reduction in the storage space of the model up to ×17 times compared to 3DGS. Our experiments show the efficiency of BBSplat on standard datasets of real indoor and outdoor scenes such as Tanks&Temples, DTU, and Mip-NeRF-360. Namely, we achieve a state-of-the-art PSNR of 29.72 for DTU at Full HD resolution."

这一篇要讲清的四件事
  • 病根一句话:不是"平面图元天然画不好",而是"颜色和形状只能靠一张解析钟形";把钟形换成贴图,平面图元就能画好。
  • 三件机制:纹理渲染(交点采样颜色与透明度)、稀疏正则(让低贡献图元的纹理躺平)、纹理压缩(量化加字典,存储砍到 1/17)。
  • 一份参数三种用途:同一批平面图元,既能光栅化渲染,又能抽网格,还能直接进 Blender 做经典光栅化(重光照、镜面)。
  • 代价与边界:训练慢 8 倍(纹理反传);帧率远低于 3DGS;户外大场景(树叶类细节)落后;mesh 精度略逊 2DGS。

1画得好的抽不出网格,抽得出的画不好:3DGS 家族的两难

 画得好的抽不出网格,抽得出的画不好:3DGS 家族的两难

如果你盯着一个 3DGS 重建的场景来回看,你会发现它和电影里的"三维模型"不太一样:它没有一张连着皮的网格,而是几千到几十万个发光的椭球悬浮在空间里,一层一层叠出画面。这堆椭球画得很好,但你要是想把它导进一个游戏引擎当模型用,得到的不是一张脸,而是一团碎渣。反过来说,有人把椭球换成贴着物体表面的薄片,网格倒是干净了,渲染质量却又掉了下来。画得好的抽不出网格,抽得出网格的画不好,这就是 3DGS 家族摆在桌面上的两难。

这篇论文要回答的问题很朴素:有没有一种图元,两头都占?

先看这一页概览(图 8-1),它把论文的底气一次摆完。

同图元数下背景/平面细节更细;图元越少 LPIPS 优势越大(原文 Fig.1, p.1)
图 8-1 效果对照图(E 类 · 证据) · 原文 Fig. 1, p.1 怎么读 ①指认:左半是三列渲染对比(2DGS / 3DGS-MCMC / BBSplat,同为 40K 图元),注意地面和墙面这些平面区域的干净程度;右半是图元数量 vs LPIPS(越低越好)的曲线,BBSplat 在最下方。②读法:先横着比三列的平面细节,再竖着看曲线间距——图元越少,BBSplat 和别人的间距越大。 来源:BBSplat, Fig. 1, p.1 · © 2025 作者 · 原样引用,未修改

这张图藏着两个信息。第一,同样数量的图元,BBSplat 把背景和平面区域画得更细:那些大片无特征的地方,高斯需要几十个椭球去堆,而一块贴了纹理的平面一次就画完了。第二,右半那条曲线告诉读者一个更深的规律:图元越少,BBSplat 的优势越大。这不是巧合,它正是本篇要讲的核心机制的必然结果,读到第 6 章压缩的字节账时你会明白为什么。

为什么会有这个两难

先给两难补一张谱系图。3DGS(2023)用三维高斯椭球当图元,渲染质量好、速度快,但它把场景当作"一堆悬浮椭球",并没有一张真正的表面,所以网格提取是它的软肋:把椭球合并成面片后,几何精度惨不忍睹。2DGS(2024)换了个思路,把椭球压成贴住物体表面的平面椭圆,平面天生贴合表面,网格提取自然就顺了,Chamfer Distance 一路降到 0.80。可代价是渲染指标全面垫底:固定存储下,2DGS 在 Tanks&Temples 上的 LPIPS 是 0.4446,3DGS 只有 0.3130,差了整整一截。

为什么会这样?因为 2DGS 的平面虽然贴了表面,但它的颜色和透明度仍然是一个解析的二维高斯钟形:G(u,v)=exp(−(u²+v²)/2),形状对称、固定、没有细节。一个平面想画出一面斑驳的墙,只能靠一堆小平面去堆,每个小平面的颜色用球谐函数凑。平面贴合了表面,却丢了表达能力。

把 3DGS 的网格提取失败再说具体一点,它并非"方法没写好",而是表示本身的毛病。3DGS 的场景是一堆椭球,椭球之间没有明确的表面,最常见的提网格办法是把椭球位置当点云做泊松重建或 TSDF 融合。问题是椭球有大小和朝向,中心点云的密度和真实表面密度对不上,融合出来的网格往往坑坑洼洼,孔洞、浮渣、飞点到处都是。SuGaR 专门为高斯训练加了几何正则,把椭球往表面方向按,CD 从 1.96 降到 1.33,但这是"给表示打补丁",训练成本也随之上来。2DGS 的路线更本质:让图元本身就是平面,平面贴合表面,深度图天然平滑,网格提取就顺了,代价是颜色和透明度锁死在解析钟形里,渲染质量垫底。三条路各有各的账:3DGS 画得好但抽不出网格,SuGaR 靠正则硬拉几何,2DGS 抽得出网格但画不好。BBSplat 选的是第四条路:保留 2DGS 的平面基元,把解析钟形换成可学习纹理,把"形状"从公式里解放出来。

BBSplat 的赌注就在这个"丢"字上:把解析钟形换成一张可学习的贴图。每个平面图元带两张纹理:一张 RGB 管颜色、一张 alpha 管形状。形状不再由公式决定,而是从数据里长出来。于是平面图元保留了贴合表面的能力(网格照抽),又拿到了逐像素的表达力(渲染照细)。这就是标题里"一张贴图两头都拿"的全部含义。

洞见一句话:形状从纹理里长出来,不再依赖高斯钟形。

全篇导航

后面十章的路线:第 2 章先摊开 2DGS 这张解析钟形的底(公式 (1)(2));第 3 章把钟形换成贴图并推渲染管线(公式 (3)–(6));第 4 章讲训练目标怎么把纹理推向稀疏(公式 (7)–(10));第 5 章讲任意形状图元怎么增删(公式 (11)(13));第 6 章把稀疏兑现成压缩字节账;第 7、8 章是定量验证和三种用途;第 9 章消融证明每个零件都在干活;第 10 章泼冷水。读完这段,你已经拿到了整篇的导航。

2一张平面的解析钟形:2DGS 怎么画、为什么画不好

BBSplat 是 2DGS 的直系后代,参数继承、渲染管线继承,只把"透明度怎么算"这一处换掉。所以这一章先把 2DGS 的两块地基夯实:平面图元长什么样、怎么把屏幕像素映回平面坐标。

2.1 平面图元的参数化

2DGS 的场景是一批有朝向的平面椭圆。每个椭圆由五个量描述:位置 µi、二维尺度 si、旋转四元数 ri、全局不透明度 oi、球谐系数 SHi。其中球谐系数负责视相关颜色:同一个点从不同角度看,颜色会变,这正是金属、镜面反射这类效果的来源。

椭圆不是凭空悬浮的,它是一张局部坐标平面。平面上的任意一点用 (u,v) 表示,从局部坐标变到世界坐标靠一个 3×4 的变换矩阵 Hi,把旋转 Ri、尺度 Si 和平移 µi 装在一起:

(1) Pi(u,v) = Hi(u,v,1,1)ἱ = [RiSi μi ; 0 1](u,v,1,1)ἱ

拆开看:Ri Si 先对 (u,v) 做旋转缩放,µi 再把它抬到世界坐标的 (µx, µy, µz) 处。u=v=0 就是平面中心 µi。这个式子值得亲手推一遍:先乘 Ri Si 得到一个 3 维向量,加上 µi,最后补一个齐次坐标的 1,得到的正是平面上对应 (u,v) 的世界坐标。整张平面于是被 (u,v) 坐标系统一地参数化了。

这里每个参数都带着明确的几何语义。位置 µi 决定平面落在哪;旋转四元数 ri 决定平面朝哪边,这是"贴合表面"的关键,平面必须转到和局部表面法线一致的方向才能贴上去;二维尺度 si 决定平面有多大,越大覆盖的曲面越多,但太大也会跨过曲率大的区域,把不该连在一起的地方连起来。所以训练一开始,这些参数都是错的,全靠后面光度损失一点点把它们掰正。尺度还有个隐性的作用:它决定了一张平面在屏幕上占多少个像素,直接关联到"这个图元值不值得保留",第 4 章的影响值 Ii 就建立在这套尺度系统上。

2.2 透明度为什么是解析的

平面有了,颜色和透明度呢?2DGS 的答案是:一个固定的解析钟形。

(2) G(u,v) = exp(−(u²+v²)/2)

在平面中心 (u,v)=(0,0),G=1,最"实";越往边缘走,指数衰减,透明度越低。注意这个钟形没有参数可学:它的形状是写死的,所有椭圆都长一个样,只是位置、朝向、大小不同。

2.3 屏幕像素怎么映回平面坐标

渲染时要做的是"反向寻址":屏幕上像素 (x,y) 的视线,打到这张平面上哪个 (u,v)?2DGS 用显式的射线-平面求交来做:把视线写成两个齐次平面的交线(下面第 3 章会重推这个式子),交点坐标解出来就是 (u,v),再把 (u,v) 代进钟形公式 G(u,v),就得到这个像素处该平面的透明度。

这条路径走下来,一次渲染要处理的工作量是固定的:每个像素要对所有覆盖它的平面做一次求交,求完还要按深度排序、做 alpha 合成。这和 3DGS 的屏幕空间光栅化不同,后者先把高斯投影成 2D 椭圆再按椭圆叠加,省掉了显式的射线求交。2DGS 选择显式求交,换来的好处是 (u,v) 坐标是解析算出来的,深度、法线都可以从平面上直接取,网格提取时需要的几何信息齐了。代价是每个像素都要做完整的求交运算,这也是为什么 2DGS 系方法帧率拼不过 3DGS 的根源之一,第 7 章的速度账会再算一遍。

2.4 画不好的根源

把上面三节连起来看,2DGS 的"画不好"就非常具体了:它的颜色来自球谐(低频、平滑),它的透明度来自固定钟形(对称、无细节)。两者都表达不了一面斑驳的墙、一片带叶脉的叶子。平面贴合了表面(网格提取的胜利),但表达力被解析形状锁死了(渲染质量的失败)。BBSplat 要做的,就是把这两个"写死"换成"可学"。

说"球谐表达不了高频细节"要具体一点。球谐是定义在方向上的基函数,它的系数越多,能表达的方向变化越复杂,但空间上的位置变化它管不了。一张墙面上凹凸的纹理、一条木纹,是"空间上"的变化,球谐对这种变化无能为力,只能靠堆图元:一面墙放几十个小平面对齐排着,每个小平面用不同的球谐颜色拼出纹理。图元一多,存储、速度、管理成本全上来了。透明度那边更糟,钟形 G(u,v) 连"不对称"都做不到,一片叶子的剪影是带锯齿的,不是一个对称椭圆能凑出来的,同样只能靠堆。2DGS 的困境本质上是"表达工具太弱,只能靠数量来补",而 BBSplat 换的工具是纹理,一张纹理自带空间分辨率,这就是下一章的主角。

3把钟形换成贴图:BBSplat 的图元与渲染

核心机制第一章。先把方法总览摆出来,再逐式重推。

参数化扩展(b2 双纹理)与渲染路径(c2 纹理采样)总览(原文 Fig.2, p.3)
图 8-2 方法示意(S 类 · 机制) · 原文 Fig. 2, p.3 怎么读 ①指认:a 是输入(COLMAP 重建的稀疏点云与相机位姿);b 对比参数化,b1 是 2DGS 五件套、b2 是 BBSplat 换上的双纹理;c 对比渲染路径,c1 解析钟形、c2 纹理采样;d 是训练只用光度损失。②读法:从左到右读一条流水线,改动只发生在 b、c 两处,其余与 2DGS 完全一致。 来源:BBSplat, Fig. 2, p.3 · © 2025 作者 · 原样引用,未修改

3.1 参数化:五件套变七件套

BBSplat 的图元参数化是:

{µ_i, si, ri, SHi, Tᵣₚᵣᵢ, T_αᵢ}

前四项和 2DGS 完全一样:位置、尺度、旋转、球谐。后两项是新增的两张纹理:Tᵣₚᵣᵢ 是 RGB 纹理(每图元 ST×ST×3 个通道),T_αᵢ 是 alpha 纹理(ST×ST×1 个通道)。关键替换在第 2 章讲过的那一处:2DGS 用全局标量 oi 管透明度,BBSplat 改成逐纹素的 alpha 贴图。于是每个图元的形状不再是固定钟形,而是一张任意形状的剪影,由 alpha 纹理勾勒出来。

两张纹理的分工要记牢:RGB 纹理管"画什么",alpha 纹理管"画多大"。RGB 纹理的每个纹素是一个 3 维颜色,alpha 纹理的每个纹素是一个 0 到 1 的透明度。它们都是纯数据,没有任何解析公式夹在中间,想要什么形状、什么颜色,全靠训练把数值填进去。ST 是纹理边长,论文取 16,这是"质量对存储"权衡下的搜索结果,第 9 章会摆出 8/16/32/64 四档的完整账。两张纹理加一起是 ST²×4 个浮点数,单图元 4KB 起步,这个数在第 6 章会变成一张大账单。

3.2 交点怎么求:两条齐次平面

渲染第一步还是反向寻址:屏幕像素 (x,y) → 平面上的 (u,v)。2DGS 的做法是把视线定义为两条齐次平面的交线。屏幕上一个像素 (x,y) 对应视线,可以被两个屏幕空间平面唯一确定:hx=(−1,0,0,x)ᵀ 和 hy=(0,−1,0,y)ᵀ。把这两条平面变换进图元自己的 (u,v) 局部坐标系:

(3) hu = (WH)ἱhx,hv = (WH)ἱhy

其中 W 是世界→屏幕的变换矩阵,H 就是第 2 章的 Hi。变换后,交点 (u,v) 由两条平面参数的叉积给出:

(4) u(x) = (hu²hv⁴ − hu⁴hv²) / (hu¹hv² − hu²hv¹),v(x) = (hu⁴hv¹ − hu¹hv⁴) / (hu¹hv² − hu²hv¹)

其中 h_uⁱ、h_vⁱ 是各自四维向量的第 i 个分量。这个式子就是两条直线求交的标准叉积公式,分母是两平面的法线叉积,分子是各自平面与该方向的叉积。它保证 u 在 [−1;1] 内,0 对应平面中心 µi。

为什么非要用"两条齐次平面的交线"来表示视线?因为齐次坐标把平移和旋转统一成了矩阵乘法,视线从世界空间变换进图元局部空间时,只需要把 (W H)ᵀ 乘上去,不需要单独处理平移项。换一种写法也可以:把视线写成一条射线的参数式,再和图元的平面方程联立解 t,一样能得到 (u,v),但每个像素每张平面都要解一次,计算上绕了。齐次平面的好处是两条平面向量做一次叉积就出交点,还顺手给出了 u、v 两个方向的显式公式。求交的结果对图元位置 µi 有解析的梯度,这正是纹理反传能一路流到图元位置的前提(第 4 章会讲完整链路)。

3.3 采样与合成

拿到 (u,v) 后,先缩放到纹素坐标 [0; ST],再用双线性采样取纹理值 Tᵣₚᵣᵢ[u]、T_αᵢ[u]。双线性采样保证相邻纹素都参与贡献,也保证了梯度能顺利流回图元位置 µi(第 4 章的初始化一节会讲它的 CUDA 反传实现)。

双线性采样这一步是 BBSplat 渲染管线的核心工程。论文原文的说法是:我们利用双线性采样从 Tᵣₚᵣᵢ 和 T_αᵢ 中取 u=(u,v) 点的纹理值,这样相邻纹素都参与了取值,并且能算出图元位置 µi 相对纹理的梯度;实现上复用 PyTorch 的 CUDA 双线性采样代码,把它集成进 2DGS 的 CUDA 光栅化器。为什么不用最近邻采样?最近邻快,但梯度只能流到一个纹素上,图元位置一动,采样点跳到另一个纹素,梯度就断了,训练不稳定。双线性把梯度按权重分摊给四个邻居,采样点小幅移动时取值是连续的,位置梯度才有意义。

颜色沿视线怎么累积?这是体渲染的 alpha 合成:

(5) c(x) = Σi ci[u(x)] · Tαi[u(x)] · Πj<i (1 − Tαj[u(x)])

从近到远遍历图元:当前图元的颜色 cᵢ 乘它的 alpha,再乘前面所有图元"没挡住"的累积透明。和 3DGS/2DGS 的合成完全同构,只是把"高斯透明度"换成了"纹理采出的 alpha"。

3.4 颜色合成:基础色加偏移

最后一个关键式子:图元的颜色 cᵢ 是怎么来的?

(6) ci[u] = Trgb,i[u] + RGB(SHi,di)

它把颜色拆成两半:球谐基础色 RGB(SHᵢ, dᵢ)(视相关、低频、平滑)加上纹理采样值 Tᵣₚᵣᵢ[u](视无关、高频、局部)。这个拆法有两个妙处。第一,光照效果(镜面高光、色偏)由球谐承担,纹理只管材质本身,二者解耦,与 Texture-GS [53] 的思路同源。第二,正因为高频细节都进纹理、低频光照都归球谐,Tᵣₚᵣᵢ 天然趋向稀疏,这正是第 6 章压缩能成立的前提。

拆成两半还有个训练上的好处:球谐基础色负责"随视角变"的那部分,纹理负责"固定不变"的那部分,梯度不会被两个来源互相拉扯。一张图元的纹理一旦学到墙的材质,从任何角度看它都是那面墙;而球谐让同一块墙面在不同视角下呈现不同的反光。如果全部塞进纹理,纹理就得为每个视角各存一份颜色,存储直接爆炸,也破坏了稀疏性。这个"视相关归球谐、视无关归纹理"的分工,是整个设计能成立的结构性前提。

SH 基础色 + 纹理偏移合成视相关颜色:同一广告牌四个视角(原文 Fig.3, p.4)
图 8-3 方法示意(S 类 · 机制) · 原文 Fig. 3, p.4 怎么读 ①指认:中间是颜色合成公式的拆解(纹理色 T 加球谐基础色 RGB(SH,d),随视线 d 变);四周四格是同一块图元在四个相机方向下的渲染。②读法:看同一块图元四个视角颜色不同、但墙面纹理细节始终清晰——这就是视相关与局部细节并存的样子。 来源:BBSplat, Fig. 3, p.4 · © 2025 作者 · 原样引用,未修改

图 8-3 把"基础色加偏移"的视觉结果画了出来:同一块图元,四个视角下颜色不同,但墙面纹理的细节始终清晰。这就是视相关与局部细节并存的样子。

3.5 参数释义表

符号含义取值/约束
µi第 i 个平面图元的中心R³,SfM 点云初始化
si平面两轴尺度R²₊
ri旋转四元数单位四元数
SHi球谐系数视相关基础色;阶数论文未公开
TᵣₚᵣᵢRGB 纹理ST×ST×3,初始化为 0
T_αᵢalpha 纹理ST×ST×1,初始化为 2D 高斯透明度
ST纹理边长16(Table 7 搜索定)
(u,v)平面局部坐标[−1;1],0=中心

4让低贡献的图元躺平:训练、初始化与稀疏正则

图元会画了,接下来是训练。这一章回答一个问题:训练目标怎么写,纹理才既不过拟合、又稀疏到能压缩?

4.1 光度损失

训练只用光度损失,和 3DGS 管线一致:渲染图与真值图比 L1 和结构相似度 D-SSIM。

(7) Limage = (1 − λSSIM)L1 + λSSIMLSSIM

λ_SSIM 取 0.2。这就是全部监督信号:不需要深度、不需要法线(实验里引入 2DGS 深度正则只为了公平对比和 mesh 精度,见第 8 章)。

两个项各管一摊。L1 是逐像素绝对差,把颜色"拉"到正确的位置附近;D-SSIM 是结构相似度,它更看重局部邻域的亮度、对比度、结构这三样统计量的一致性,专治"颜色大致对但细节糊成一片"的毛病。两者加权后,训练只需要输入成对的图像,场景本身的长什么样、表面结构在哪,全由图像自己说话。这也是整个 3DGS 家族能快速收敛的原因之一:监督信号廉价,只需要相机位姿加图像。

4.2 过拟合的根源与正则的方向

纹理的参数多,天然容易过拟合:模型会把训练视角的颜色死记进纹理,换一个新视角,纹理里没有的内容就露馅,渲染变得嘈杂。正则的方向要跟着问题走:哪些图元在画面里真的干活? 看不见的图元(太小、太远、被挡住)不需要精确纹理,把它们推向一个"标准形"就行。

"死记进纹理"要展开说。一张纹理有 16×16×4 个参数,一个场景几万张图元,参数总量以亿计,而监督只是几百张照片。参数多、监督少,模型完全有能力把训练视角里的颜色分布抄进纹理,新视角一来,本该是"没见过的那一侧"的地方,纹理里存的还是训练时的记忆,渲染结果就出现闪烁、浮渣、重影这类过拟合症状。论文原文的描述是:由于参数数量大,纹理倾向于过拟合训练图像,导致新视角渲染输出嘈杂。正则的思路不是砍参数,而是给纹理一个"默认偏好":能少写就少写,能回到标准形就回到标准形,只有被画面明确需要的纹理细节才被允许存在。

4.3 可见度权重:谁在画面里干活

先给每个图元算一个影响值 Ii:它对自己覆盖的每个像素的 alpha-blending 贡献求和。

(8) Ii = Σx∈Ri Tαi[u(x)] · Πj=1..Kx (1 − Tαj[u(x)]),wi = σ − min(Ii,σ)(若 Ii>0;否则 0)

注意这个判据和 2DGS 的区别:2DGS 用投影半径判断图元是否值得优化,只看了"入没入视锥",没看它被多少别的图元挡住;BBSplat 直接用真实的 alpha-blending 贡献,被挡得死死的图元,Ii 自然小,wi 归零,正则就不碰它,避免过度正则化那些本来就少见光的区域。σ 是影响值上限,论文取 σ=500,只正则化"明确可见"的图元(σ 的搜索账在第 9 章)。

这个判据的设计很精细,值得再拆一层。Ii 的求和范围 Ri 是这个图元覆盖到的像素集合,每一项是"这个图元在这个像素上的 alpha 贡献"乘"前面所有图元没挡掉的累积透光率"。两个因子相乘,含义就清楚了:一个图元想对画面有影响,光自己有 alpha 还不够,前面不能有别人把它挡死。一张藏在墙后面的图元,后面那个因子趋近于 0,Ii 小,wi=0,正则完全不碰它,它的纹理爱怎么乱就怎么乱,反正看不见。反过来,一个占据画面中心的图元,两个因子都大,Ii 超过 σ,wi 归零,正则只管住 Ii 在 (0, σ) 区间里的"中等可见"图元。这个区间外的两头都不动,一是彻底看不见的没必要管,二是太重要的动了反而伤质量。

4.4 稀疏正则

有了 wi,正则就按可见度加权:

(9) LRGB = (1/N)Σiwi‖Trgb,i‖,Lα = (1/N)Σiwi‖Tαi − G‖,Ltexture = λRGBLRGB + λαLα

三行各有分工:L_RGB 把可见图元的 RGB 纹理推向 0,也就是只留球谐基础色,高频细节越少越好;L_α 把 alpha 纹理推向标准高斯形 G,也就是让"形状"回到第 2 章那个解析钟形,越"老实"越好。两个 λ 都取 1e−4,力度不大,但足以改变纹理的分布。

公式 4-4(原文 10) L = L_image + L_texture

为什么这一步是"为了让压缩能成立"而设的:Tᵣₚᵣᵢ 被推向 0,T_α 被推向 G,于是两把纹理里都出现大量接近 0 的值。字典压缩(第 6 章)吃的就是这种稀疏性。

两个正则项的目标形态值得对照着看。L_RGB 的靶子是零向量:RGB 纹理被推成"全零",画面颜色完全靠球谐撑,这是最稀疏的形态,压缩时零值全都能被字典吃掉。L_α 的靶子不是零,而是标准高斯形 G:alpha 纹理被推成钟形,但钟形本身不等于 0。所以论文在这里多做了一个动作:把 alpha 纹理减去高斯形再存,T_α − G 的结果才趋向零值,压缩时再吃这一波。论文原文的描述是:我们通过减去高斯分布 G 来增加 T_α 的稀疏性,确保纹理中有更多零值。两个靶子一个直接归零、一个先减去基线再归零,殊途同归,都是给第 6 章的字典压缩喂料。

4.5 初始化:稀疏点云与"补天"

训练从哪里起步?BBSplat 用 COLMAP 重建的稀疏点云初始化图元位置,数量不够时用迭代最远点采样抽稀。室外场景还有个特殊问题:天空和远景没有点云覆盖,光靠 SfM 点根本画不出来。论文的做法是在场景外包一个大球,用 Fibonacci 算法均匀撒 10K 个点当图元种子(图 8-6),球半径取"场景中心到最远 SfM 点的距离",保证所有点都被罩住。

天空球:SfM 点外围 Fibonacci 均匀采样(原文 Fig.6, p.12)
图 8-6 方法示意(S 类 · 机制) · 原文 Fig. 6, p.12 怎么读 ①指认:白色小点是 SfM 重建出的稀疏点,灰色点是 Fibonacci 球面上均匀采样的种子,两者共同构成初始图元集。②读法:看球半径正好罩住所有 SfM 点——天空和远景就是靠这批球面点补出来的。 来源:BBSplat, Fig. 6, p.12 · © 2025 作者 · 原样引用,未修改

撒点数量有梯度:点云少于 20K 时球面点降到 2K,少于 10K 时整个禁用。初始化后前 500 次迭代冻结纹理只调位姿和球谐,让图元先落到该在的位置,再放开纹理去学细节。训练总步数 30,000,500 到 25,000 步之间做密度控制,最后再单独精调 2,000 步球谐,让基础色适应纹理已经学好的细节。

"先落位、再学细节"的分阶段策略是这篇论文训练设计的骨架。前 500 步纹理完全冻结,只有位姿、尺度、球谐在动,因为一开始纹理里还是初始化的高斯形,图元位置是错的,这时候放开纹理,梯度会把纹理按错误的位置乱涂。等图元大致贴上了表面,500 步后放开纹理学细节;到 25,000 步密度控制收工,再单独精调 2,000 步球谐,因为球谐基础色要和纹理细节配合好,一起放开的话两个学得都糙。优化器用的是 Adam,超参直接沿袭 3DGS 管线推荐值;球谐和尺度的学习率取 5e−3,旋转的学习率压到 1e−3,纹理没有单独列学习率,跟随 Adam 默认。

4.6 双线性采样的 CUDA 反传

纹理采样的梯度怎么流回去?论文复用了 PyTorch 的双线性采样 CUDA 实现并集成进 2DGS 的光栅化器。梯度按双线性权重分摊给四个相邻纹素,同时算出一份对 (u,v) 位置的梯度,经变换矩阵 Σ 回流到图元的位置和旋转。伪码(原文 Algorithm 1/2,见附录)本质就是:正向采样的逆运算,把 dL/dω 按贡献权重分回去。

反传的具体步骤值得走一遍,它是理解"纹理为什么能训练"的最后一环。正向采样时,采样点 (u,v) 先被映射到纹素网格坐标,四周四个纹素按距离加权合成采样值,权重就是双线性系数。反传时 Algorithm 1 干的事完全对称:拿到这个采样点上的梯度 dL/dω,按那四个同样的权重把梯度分别加回四个纹素的梯度累加器。这是纹理本身梯度的去向。但还有一路梯度要回图元:采样点 (u,v) 本身是从平面求交解出来的,它随图元位置和旋转变化。Algorithm 2 把这路梯度经变换矩阵 Σ 汇总,形成对图元位置和旋转的调整量,再喂给位姿优化。两条梯度支路各回各家,一条进纹理、一条进位姿,这就是论文所说的"梯度按贡献权重重分配"的完整含义。

5形状任意时怎么增删图元:MCMC 密度控制改造

场景里图元的数量不是一开始就定死的,训练中要不断增删:稀疏处克隆、密集处拆分、多余的杀掉。3DGS 用分裂/克隆/剪枝的启发式;3DGS-MCMC [25] 把它改写成 MCMC 采样,把增删变成确定性状态转移。BBSplat 沿用了 MCMC,但撞上一个新问题:状态保持公式是为高斯设计的,任意形状图元不能照搬。

为什么需要密度控制?因为初始化给不出完美的图元分布:点云稀的地方图元少,一块大平面想覆盖住就得靠数量堆;点云密的地方图元挤在一起,互相遮挡,又浪费参数。密度控制就是让图元数跟着场景复杂度走:简单区域收敛到少量图元,复杂区域繁殖出足够多的图元。3DGS 原版的启发式依赖手工调的阈值和场景,3DGS-MCMC 把"该增该减"重构成一个马尔可夫链的确定性状态转移,每一步该克隆谁、该杀掉谁都由当前状态算出来,少了很多魔法数字。BBSplat 直接沿用了这套框架,代价是要重新回答一个 MCMC 里最核心的问题:增删操作怎么保证渲染输出不变?

5.1 高斯版的保持公式

MCMC 把一个图元"克隆成 N 份"时,必须保证渲染输出不变。对高斯,克隆后的不透明度要按这个公式调整:

(10) onew = 1 − (1 − ooldN)1/N

直观理解:原来一个图元挡住 (1−o) 的光,克隆成 N 个后,每个图元挡 (1−o_new),N 个叠起来要挡同样多,于是 (1−o_new)^N = 1−o_old,解出 o_new 就是这个式子。同时协方差也要按式 (12) 缩并,保证空间分布不变。

推导这个过程要走两步。第一步是透明度守恒:克隆前一个高斯挡住 1−o_old 的光线;克隆成 N 个同位置的高斯后,每个挡住 1−o_new,光线要穿透 N 个才能到达后面,总透光率变成 (1−o_new)^N,令它等于原来的 (1−o_old),解出 o_new。注意这是"挡住多少"的守恒,不是"颜色不变",颜色由球谐决定,克隆后每个新图元的球谐直接复制。第二步是空间守恒:原来的高斯有协方差,克隆后每个新高斯要缩小,使 N 个高斯的空间分布和原来一个的分布重合,这就是式 (12) 的协方差缩并。两步合起来,克隆前后任意像素上的渲染结果都一样,MCMC 的状态转移才成立。

5.2 为什么协方差调整对 BBSplat 失效

式 (12) 的协方差调整建立在"图元是高斯、透明度由协方差决定"这个前提上。BBSplat 的图元透明度是逐纹素的 alpha 纹理,不是协方差函数。按式 (12) 去改尺度,会连带把纹理采样的 (u,v) 范围改掉,渲染状态根本保持不住。

"保持不住"要算给它看。高斯的透明度是协方差的解析函数,改了协方差,透明度分布跟着变,式 (12) 就是按这个联动关系设计的。BBSplat 的透明度不来自协方差,来自一张 16×16 的 alpha 纹理,改尺度 si 后,(u,v) 到世界坐标的映射变了,同一个 (u,v) 点对应的世界位置换了,纹理采样出来的透明度就错位。换句话说,式 (12) 想让"空间分布不变",但纹理图元里空间分布和透明度是绑在两张不同的载体上的,动尺度只动了空间,没动纹理,守恒无从谈起。照搬高斯版的保持公式,克隆前后渲染结果直接不一样,MCMC 的确定性就破了。

5.3 只调 alpha 纹理

论文的解法很直接:透明度只由 alpha 纹理管,那就只调 alpha 纹理。

(11) Tα,new = 1 − (1 − TαN)1/N

和式 (11) 形式一模一样,只是把标量 o 换成逐纹素的 T_α。因为 alpha 纹理控制平面上每个点的透明度,整体缩放它等价于调整整块图元的"平均不透明度",不需要再动尺度。死亡判定也对应改掉:高斯比的是标量 oi 与阈值 γ=5e−3,BBSplat 比的是 alpha 纹理的平均值 ⟨T_α⟩ < γ。

替换之后,两件事一起简化了。克隆侧:T_α 是逐纹素的,式 (13) 对每个纹素独立求值,一个 16×16 的 alpha 纹理做一次逐元素运算就完成克隆,而尺度、位置、球谐原样复制。死亡侧:高斯的剪枝看全局不透明度,纹理图元没有全局不透明度,取 ⟨T_α⟩ 这个平均透明度当代理,低于阈值 γ 就判死。γ 沿用 3DGS-MCMC 的 5e−3。这个改动的本质是把"状态保持"的载体从协方差挪到纹理:高斯把形状信息压在协方差里,纹理图元把形状信息压在 alpha 纹理里,谁管形状,增删规则就跟着谁走,BBSplat 选择让规则迁就纹理而不是反过来。

这一章的要点一句话:图元能长成任意形状,代价是增删规则得跟着"形状载体"走,BBSplat 把载体从协方差换成了纹理,规则就从式 (12) 简化成式 (13)。

64KB 压到能进字典:纹理压缩的字节账

前几章的稀疏正则,在这一章兑现成真金白银的存储。先把账算清楚:一个图元带两张 ST×ST 纹理(3+1 通道),浮点存要多少字节?

公式 6-1(字节账) (ST² × 3 + ST² × 1) × 4 字节 = 4·ST² × 4 = 16·ST² 字节 ST=16 时:16 × 256 = 4096 字节 = 4KB / 图元

4KB 一个图元,60K 个图元就是 240MB 纹理,这还没算球谐。存储是实打实的负担,必须压。

6.1 第一步:8bit 量化,砍 4 倍

纹理值归一化到 [0;1],量化为单字节:

公式 6-2(量化) ε̂ = ⌊ε · 255⌉,载入时 ε = ε̂ / 255

每纹素从 4 字节降到 1 字节,纹理账从 4KB 变 1KB。代价是量化误差,但论文实验显示指标几乎不掉(见第 9 章消融的 compress 一行)。

量化这一步放在"减去球谐基础色"之后做,顺序不能反。压缩管线的完整链条是:先让纹理趋向稀疏(第 4 章的正则),再减去球谐基础色和标准高斯形这两个基线(第 4 章讲过),最后把剩下的偏移量量化到 8 位。先量化后减基线也行不通,因为减去基线后的值是稀疏的,量化只是把 32 位浮点压成 8 位整数,稀疏性不变,压缩率不变;但先减基线再量化,量化的对象是更小的数,精度损失也小。8 位量化的实现是标准的:纹理值归一化到 [0,1],乘 255 取整,载入时再除以 255 还原。量化误差的量级是 1/255,肉眼几乎不可见,第 9 章的消融会给出压缩前后 PSNR 只差 0.03 的直接证据。

6.2 第二步:稀疏性喂给字典压缩

量化后还有 1KB,还不够。真正的杠杆来自第 4 章的正则:Tᵣₚᵣᵢ 被推向 0、T_α 减去高斯形后也趋零,纹理里大量字节是 0 或接近 0。字典压缩(ZIP 系算法)吃的就是这种重复与稀疏。论文的做法是把 alpha 纹理减去标准高斯形再存,把"接近高斯"的冗余也榨掉。

字典压缩为什么吃得了纹理?ZIP 一类算法的原理是找重复:一串字节里出现频率高的子串被收进字典,后续出现只存一个引用。纹理数据天然适合它,因为稀疏正则把大量纹素推成了同一个值(0 或 255 附近的几个离散值),整块纹理其实就是几十个重复模式的拼接。更妙的是逐图元的纹理之间也在重复:一面墙可能由几十个图元覆盖,它们的纹理学到的是同一种材质,字节串高度相似,字典跨图元也能命中。论文原文的表述是:纹理的稀疏特性使我们能使用高效的基于字典的压缩方法(例如 ZIP)进一步降低存储开销。整条压缩管线平均省约 7 倍存储,这是对 3DGS 全套存储 ×17 的工程内核。

6.3 复算:三个口径,别混

论文里出现了三个压缩倍数,口径完全不同,最容易读混:

口径算式结果
对 3DGS 的最终倍数(摘要/Table 3)121 MB / 7 MB×17.3(论文称 ×17)
压缩管线内部收益(Table 5 消融)662 MB / 93 MB×7.1(正文称 ~7 倍)
大图元档存储缩减(Table 2)Mip-Splatting 176 MB → BBSplat 32 MB×5.5(论文称 ×5,比较对象是 Mip-Splatting 而非 3DGS)

×17 是卖点,×7 是工程口径,×5 是另一个设定下的横向比。三个数都对,只是比的东西不同。读论文时看到"reduction up to ×17"别以为压缩管线本身有 17 倍,那是"文本化图元 vs 3DGS 全套存储"的终值。

三个口径合起来看,能还原出存储账的完整结构。3DGS 的 121MB 是啥都有的全套(位置、尺度、旋转、球谐、不透明度),BBSplat 的 7MB 是文本化图元压缩后的全套。中间差了 17 倍,大头来自两处:纹理比球谐便宜(一张 16² 纹理只有 1KB,而高斯的球谐系数几十上百个浮点),加上字典压缩再砍一层。第二个口径 ×7 是"压缩管线内部收益":不压缩 662MB,压缩后 93MB,这是纯量化加字典的功劳,不含表示本身的差距。第三个 ×5 是把 BBSplat 大图元档(32MB)和 Mip-Splatting(176MB)比,比的对象都不是 3DGS。读表先看分母,这句口诀在这章最管用。

6.4 同为纹理方案,为什么 Texture-GS 不行

论文顺手和 Texture-GS [53] 比了一把(Table 8):同为"给高斯贴纹理",Texture-GS 用 MLP 把球谐颜色和纹理对应起来,DTU 上 PSNR 30.03 vs BBSplat 30.81,LPIPS 0.1440 vs 0.1055。差别在哪?Texture-GS 的纹理挂在高斯表面,受限于球形纹理空间,处理不了大场景(这也是为什么只比 DTU),而且它的纹理没有稀疏正则,压不了。纹理本身不是关键,关键是谁在用、怎么训练、能不能压。

这场对比把 BBSplat 的设计取舍照得很清楚。Texture-GS 的纹理定义在高斯椭球的球面参数化上,一个高斯贴一张球面纹理,纹理空间是球形的,只适合单个物体绕一圈采样的场景,场景一大,椭球数上万,球面纹理的存储和管理直接失控。BBSplat 的纹理贴在平面上,纹理空间是局部的方形,天然适配大面积场景的分块表达。训练侧的区别更本质:Texture-GS 的纹理是 MLP 的输出,和球谐纠缠在一起,没有正则去逼它稀疏,存下来的就是一团稠密数据,压缩无从谈起。BBSplat 有第 4 章那套正则,纹理生来就是稀疏的。同样的"贴纹理"思路,一个压不了、一个压到 ×17,差距全在训练目标和载体选择上。

7三张表两个设定下的验证:27 场景实测

机制讲完,上证据。实验设定先记下:27 个真实场景,Mip-NeRF-360 7 个、Tanks&Temples 5 个、DTU 15 个;测试帧每 8 帧取 1;分辨率对齐 3DGS 惯例;单卡 RTX 4090。

7.1 固定存储档:同一存储空间,比谁画得细

Table 1 把所有方法限制到同样的存储空间(T&T 19MB、DTU 7MB、Mip-360 38MB),比三件事:质量、速度、图元数。

数据集指标3DGS2DGS†BBSplat
T&TPSNR / LPIPS20.90 / 0.313020.82 / 0.322324.32 / 0.2143
DTUPSNR / LPIPS26.10 / 0.345227.18 / 0.343829.39 / 0.2770
Mip-360PSNR / LPIPS25.25 / 0.317925.66 / 0.319227.49 / 0.2336

复算两个数:T&T 上 BBSplat 比 3DGS 的 PSNR 高 +3.42,LPIPS 低 0.0987;DTU 上 PSNR 高 +3.29。更关键的是图元数:达到同样质量,BBSplat 只用 15K/30K/60K 个图元,而 3DGS 要 30K/80K/160K。文本化图元的信息密度更高,这就是图 8-1 右半那条曲线在固定存储设定下的定量版。

这个设定有一个先决条件要说明白:固定存储意味着各方法的图元数是被存储预算限制住的,不是各自的最优值。3DGS 在 19MB 的预算下只能放 30K 个高斯,2DGS 同样受限,而 BBSplat 因为单图元便宜,同预算下能多放图元。所以这张表比的是"在同一个存储成本下谁画得更好",而不是"谁的上限更高"。结果上 BBSplat 全面领先,靠的不是把每个图元画得更准,而是同样的钱买了更多的表达能力。图 8-1 右半那条 LPIPS 曲线的走势正是这个关系的连续版本:横轴是图元数,竖轴是 LPIPS,BBSplat 的线压在下面,图元越少、压得越狠。

7.2 大图元档:放开数量,比谁的天花板高

Table 2 放开图元数量到各方法推荐上限,看质量天花板。

数据集指标3DGS3DGS-MCMCBBSplat
T&TPSNR / LPIPS24.31 / 0.194225.56 / 0.170025.12 / 0.1728
DTUPSNR / LPIPS28.39 / 0.285029.68 / 0.254429.72 / 0.2609
Mip-360PSNR / LPIPS28.97 / 0.184529.52 / 0.162628.33 / 0.1971

DTU 上 BBSplat 拿到 29.72 的 SOTA PSNR(与 3DGS-MCMC 的 29.68 几乎持平但存储少一半多:32MB vs 121MB)。T&T 第二,Mip-360 落后,这两个坑第 10 章细说。

这张表还有一个容易被忽略的观察:BBSplat 用最少的图元拿到接近最优的质量。DTU 上 BBSplat 60K 个图元,3DGS-MCMC 是 803K,差了 13 倍多;T&T 上 300K 对 2,234K。图元数少意味着后续所有操作都便宜:存储、加载、光栅化。3DGS 系方法的图元数会随训练自动繁殖,几十万上百万是常态,而 BBSplat 的文本化图元用纹理把细节吃掉,繁殖压力小得多。这正是"文本化表示的信息密度"在大图元档下的另一种体现:不是 BBSplat 画得比谁都好,而是它用少得多的图元画到了同一水平。

7.3 压缩专项:和专门做压缩的比

Table 3 是存储专项对比:Reduced-3DGS 30MB、Compact-3DGS 10MB,都专门为省存储设计,BBSplat 7MB 的同时 PSNR 29.39 还最高。省存储不是靠牺牲质量换的,是文本化表示的附带红利。

这场对比的关键词是"专门":Reduced-3DGS 和 Compact-3DGS 是冲着"把 3DGS 压小"这个目标设计的,一个靠稀疏化加修剪,一个靠紧凑编码,它们压缩的是高斯的参数本身。BBSplat 没有为压缩做过任何专门设计,存储优势来自表示层的天然属性:纹理便宜、球谐便宜、正则让纹理稀疏、字典压一遍。结果一个 7MB 对 30MB 和 10MB,质量还更高。这个"附带红利"的意义在于它没有引入额外的复杂度:训练管线、渲染管线、存储管线都是同一个表示自带的,压缩只是把已经存在的稀疏性兑现成字节。为省存储而设计的方法,输给了没为省存储设计的表示,这是对文本化表示效率最直接的背书。

7.4 定性:看画面

两张定性图都是三数据集对比(图 8-4 主文、图 8-9 补充三场景)。怎么读:每行一个场景,四到五列分别是 3DGS、2DGS、3DGS-MCMC、GT、BBSplat(Ours)。中心物体大家画得差不多,差别在背景和平面区域:墙面、地面、桌面这些大片区域,BBSplat 更干净更细。DTU 场景里 BBSplat 对光照的处理更稳。

三数据集定性:中心物体持平、背景/平面细节更好(原文 Fig.4, p.6)
图 8-4 定性结果(E 类 · 证据) · 原文 Fig. 4, p.6 怎么读 ①指认:三行三数据集(Tanks&Temples / Mip-NeRF-360 / DTU),每行五列(3DGS、2DGS、3DGS-MCMC、GT、Ours)。②读法:先看中心物体是否都清晰,再看墙面地面这些平面区域的干净程度和纹理细节——差别就藏在背景里。 来源:BBSplat, Fig. 4, p.6 · © 2025 作者 · 原样引用,未修改

拿 Tanks&Temples 那行细看。场景是户外的火车和建筑,3DGS 那一列建筑外立面是糊的,砖缝、窗框的轮廓被高斯椭球抹成一团;2DGS 那一列比 3DGS 干净,但墙面像贴了层雾,细节少;3DGS-MCMC 最好的一列,边缘清晰,可背景天空和远景开始出现噪点。BBSplat 那一列,建筑边缘利落,墙面砖缝纹理是实打实一根一根的,天空干净。这个差别对应到机制上就是第 3、4 章讲的事:墙面是平面区域,纹理图元一张贴图画完一整块墙,砖缝是纹理里的高频细节;高斯图元只能用椭球堆,堆到边缘就露怯。中心物体(火车头、雕塑)大家差不多的原因也直白,那是立体区域,平面图元反而要多个拼接,优势不在,这正好和第 10 章的边界呼应。

三数据集各三场景补充定性(原文 Fig.9, p.17)
图 8-9 定性结果(E 类 · 证据) · 原文 Fig. 9, p.17 怎么读 ①指认:结构同图 8-4,补充 Lighthouse / Francis / Truck、Bonsai / Kitchen / Counter、Scan105 / Scan118 / Scan65 共九个场景。②读法:逐格核对墙、地、天空的细节保留——这是验证"平面区域更细"这一论断的第二份证据。 来源:BBSplat, Fig. 9, p.17 · © 2025 作者 · 原样引用,未修改

图 8-9 里的九组场景把结论扩到更大范围。Lighthouse 那组,BBSplat 对塔身砖面和台阶的处理明显更利落;Kitchen 和 Counter 是室内,橱柜门板、台面这些平面区域的优势延续;Scan 系列是 DTU 的雕塑场景,曲面多,BBSplat 和 3DGS-MCMC 的差距缩小,但背景墙面依然更稳。把这九组和图 8-4 的三组合在一起看,结论的适用范围就清楚了:优势稳定出现在平面区域占主导的场景(建筑、室内),在纯曲面场景(雕塑)优势收窄但不输。这个边界和 Table 9 逐场景的量化结果一致,第 10 章会把它写进边界清单。

7.5 代价登记:速度

同一张表里藏着代价:固定存储档 BBSplat 的 FPS 是 162±18(DTU)/ 230±24(T&T)/ 96±11(Mip-360);大图元档是 92±10 / 47±4 / 28±2。3DGS 分别是 690±77 / 1362±165 / 866±191 和 364±42 / 441±80 / 299±49。BBSplat 的帧率只有 3DGS 的四分之一到十分之一。纹理采样和逐纹素 alpha 合成比高斯解析求值贵得多。这还不是全部,第 10 章还有一笔训练时间的账。

速度差在哪一步,要算到渲染管线里。3DGS 的光栅化是屏幕空间投影加椭圆叠加,每个高斯只需要一个解析公式算贡献,核心里没有显式求交。BBSplat 的每个像素、每张覆盖它的平面都要做一次射线求交(第 3 章的两条齐次平面),交完还要对每个交点做纹理采样,双线性采样一次要取四个纹素、算四次权重。像素和平面叠得越多,这条链路越长。Mip-360 那档最慢(28±2 FPS)也最说明问题:户外大场景图元多、像素被覆盖得多,求交和采样的总量最大。所以速度代价是"显式求交加纹理采样"的结构性成本,不是可以靠优化抹平的常数,这一点和训练时间的账是同一个根源。

8从渲染到网格再到光栅化:一个表示的三种用途

第 7 章证明了"能画",这一章证明"不止能画"。平面图元这份参数,天生带三张通行证。

8.1 用途一:光栅化渲染(本行当)

就是前面几章讲的 splatting 渲染,这是主用途。训练时的每一次前向都要走一遍:图元按深度排序、逐像素求交、采样纹理、alpha 合成。这条路不需要任何额外设施,光度损失直接驱动训练,第 7 章的定量结果都是这条路跑出来的。为什么把这条路线单独列一节?因为下面两种用途都是同一份参数在不改表示的前提下另起的用途,光栅化是这份参数的"出厂配置"。

8.2 用途二:网格提取

平面图元贴合表面,mesh 提取顺理成章:渲染训练视角的深度图,用 TSDF 融合(Open3D)合并成网格。结果看 Table 4:

方法Chamfer Distance↓PSNR↑Storage↓
3DGS1.9628.39121 MB
SuGaR1.3327.951059 MB
2DGS0.8028.0459 MB
BBSplat0.9129.7232 MB

复算:BBSplat 的 CD 0.91,比 2DGS 的 0.80 略差,但比 3DGS 的 1.96 好一倍多,也比专门做表面重建的 SuGaR(1.33)好。注意这个 0.91 vs 0.80 是第 10 章的一条边界:BBSplat 在 mesh 精度上没有全面超越 2DGS,它赢在"渲染质量 + 网格精度 + 存储"三项的打包。

网格提取的流程本身值得展开,因为"为什么平面图元抽得出网格"是这一节的核心。训练收敛后,从每个训练视角渲染一张深度图。平面图元在交点上直接给出深度,深度图天然是平滑的,没有高斯系方法那种椭球交叠造成的深度跳变。然后把多张深度图用 TSDF 融合(Open3D 实现)合并:每一张深度图往体素格子里写一个带符号的距离场,多视角的符号距离场互相纠正、互相补齐,最后在零等值面上抽等值面,得到三角网格。关键前提在第 8.1 节说过:即便是有限的图元数,平面图元也能给出细节准确的深度图(原文 Fig.5 (b)),这是网格质量的直接来源。

平面图元可直接光栅化;mesh 优于 3D 高斯系(SuGaR)(原文 Fig.5, p.8)
图 8-5 定性结果(E 类 · 证据) · 原文 Fig. 5, p.8 怎么读 ①指认:a 是带 alpha 纹理的平面直接进经典光栅化做 ray-tracing 效果;b 是平面光栅化出的物体轮廓,干净到可直接用于网格提取;c 是提取出的网格对比(2DGS / SuGaR / BBSplat)。②读法:看 c 的表面完整度和孔洞——BBSplat 的网格介于 2DGS 与 SuGaR 之间。 来源:BBSplat, Fig. 5, p.8 · © 2025 作者 · 原样引用,未修改

图 8-5 的 c 栏是三张网格并排,这是网格质量最直观的证据。2DGS 的网格表面细密完整,但注意它 PSNR 只有 28.04,画得不够好;SuGaR 的网格有些区域缺面,孔洞和凸起都看得见,CD 1.33 就是这些缺陷的量化;BBSplat 的网格介于两者之间,完整度接近 2DGS,但 CD 0.91 里多出的那 0.11 正是从这里来的,局部的边缘还不够贴。值得再提一句的是存储:SuGaR 的网格配套存储是 1059MB,比 3DGS 还大一个量级,网格精度和存储在这里是负相关的,而 BBSplat 32MB 同时给网格和渲染。网格质量不是这张表里唯一的量,它是"渲染 + 网格 + 存储"打包之后的价格标签。

更多 ray-tracing(重光照/镜面)与提取网格(原文 Fig.8, p.15)
图 8-8 定性结果(E 类 · 证据) · 原文 Fig. 8, p.15 怎么读 ①指认:同图 8-5 的结构,a 展示了重光照和镜面反射这类 ray-tracing 效果(Blender 中渲染),b、c 是平面光栅化物体与提取网格的更多例子。②读法:看 a 的光照效果——经典光栅化管线直接吃平面图元,不需要先抽网格。 来源:BBSplat, Fig. 8, p.15 · © 2025 作者 · 原样引用,未修改

图 8-8 的 a 栏是"经典光栅化"这一用途最直观的证明。DTU 的雕塑和场景被导进 Blender 后,重新打了光:原本训练时没见过的光照方向下,物体表面出现新的高光和阴影,镜面反射也有了。这说明平面加纹理这套表示携带了真实的光学属性,不是只记住了训练视角的观感。b、c 栏补充了更多物体的平面光栅化和网格提取例子,把 Fig.5 的单场景结论扩到多场景。这套结果的含金量在于它是一条零额外成本的路线:不做网格提取、不做模型烘焙,直接拿训练出来的平面参数进标准渲染器,第 8.3 节讲实现。

8.3 用途三:经典光栅化(白送的)

平面图元本身就是平面,把它导出成两个三角形加一张拼接的纹理图,就能喂给 Blender 这类标准渲染器做经典光栅化:重光照、镜面反射、编辑,全都来了(图 8-5 a、图 8-8 a)。不需要先抽网格,省掉一道工序,还保留了照片级渲染。论文用 StopThePop 每射线排序算法减少叠合伪影,注意这个只在可视化里用,不在训练管线里。

实现细节走一遍,它比听起来还省事。训练收敛后,每个平面图元就是一张平行四边形:位置、尺度、旋转都是现成的,把它拆成两个三角形(一条对角线劈开),RGB 纹理和 alpha 纹理直接当 UV 贴图用,(u,v) 坐标就是 UV 坐标,不需要任何重新参数化。所有图元的三角形和纹理拼成一份标准的网格文件,Blender 直接导入。由于图元数量少(几十万),这份文件不会像高斯系那样爆炸。多平面叠合时会有顺序伪影,论文用 StopThePop 的逐射线排序在可视化管线里解决,训练和在线渲染不受影响。这条路线把"训练出的场景"直接变成了"能编辑的资产",中间没有一个环节是后加的。

三种用途的账:同一份 {µ, s, r, SH, Tᵣₚᵣᵢ, T_α} 参数,渲染、网格、光栅化三吃。这是"显式平面图元"这个选择带来的结构性红利,不是后加的插件。

9每一块都在起作用:消融与参数选择

论文自己把每个零件拆下来试了一遍(Table 5,Tanks&Temples,800×600)。先看消融:

配置PSNR↑SSIM↑LPIPS↓Storage↓
w/o Tᵣₚᵣᵢ(无颜色纹理)25.170.86840.177460 MB
w/o T_α(无 alpha 纹理)25.260.87100.185872 MB
w/o L_texture(无正则)25.540.87910.1655131 MB
w/o compress(无压缩)25.710.88180.1630662 MB
Full25.680.87970.164993 MB

复算读法:去掉 Tᵣₚᵣᵢ,PSNR 掉 0.51(25.68→25.17);去掉 T_α,LPIPS 涨 0.0209(0.1649→0.1858);去掉正则,存储从 93MB 涨到 131MB 且指标没有变好;去掉压缩,存储暴涨到 662MB(7.1 倍)而 PSNR 只高 0.03。结论很清晰:四件全是必要的,唯一可以取舍的是压缩——它用 0.03 PSNR 换 7 倍存储,是划算的买卖。

四行消融各自的退化方向也值得对号入座。去掉 Tᵣₚᵣᵢ,画面只剩下球谐基础色,高频细节全没了,PSNR 掉 0.51、SSIM 掉 0.0113,这正是"纹理管细节"的直接证据。去掉 T_α 更说明问题:LPIPS 涨了 0.0209,SSIM 反而升了 0.0087,因为 alpha 纹理退回高斯形后形状更规整,全局统计相似度反而好看,但逐像素感知质量变差,这正是"alpha 纹理管形状"的量化印证。去掉正则的后果不在质量而在存储:131MB 比 93MB 涨了四成,指标没有任何提升,说明正则没有牺牲质量换稀疏,而是白捡的稀疏。去掉压缩就回到第 6 章算过的 662MB,PSNR 仅高 0.03,肉眼完全不可辨,压缩是这笔交易里最划算的一环。

500→30000 迭代:轮廓从高斯形长成任意形状,纹理从浆糊变结构(原文 Fig.7, p.15)
图 8-7 定性结果(E 类 · 证据) · 原文 Fig. 7, p.15 怎么读 ①指认:上排是 500 / 5000 / 15000 / 30000 轮迭代的图元轮廓(alpha 阈值化后的剪影)与渲染结果,下排是对应时刻的 alpha 纹理与 RGB 纹理。②读法:看轮廓从初始的高斯形逐渐长出物体真实边缘,纹理从一团浆糊变成有结构的图案——"形状从纹理里长出来"的实拍。 来源:BBSplat, Fig. 7, p.15 · © 2025 作者 · 原样引用,未修改

图 8-7 是"形状从纹理里长出来"这句话的实拍:500 步时图元还是规规矩矩的高斯剪影,15000 步已经长出物体的真实轮廓,30000 步定型。下排的 alpha 纹理从模糊渐变到带清晰边缘,正是稀疏正则与光度损失拉锯的结果。

两个超参的搜索账(附录 Table 6/7):

  • σ(影响阈值):10→1500 扫一遍,PSNR 在 500 处最高(25.99),存储从 139MB 一路降到 87MB。过正则让更多图元变成高斯形,好存但掉质量;欠正则存得贵。取 500。
  • 纹理尺寸 × 图元数:固定 40.96M 参数总量,扫 8²×640K / 16²×160K / 32²×40K / 64²×10K。16² 这一档 PSNR 25.99、存储 102MB,接近最优且图元数够多。纹理太大会把图元数压得太少,空间覆盖不足(64² 掉到 23.34)。

σ 那张表(Table 6)的五个点值得连成一条线看。σ 从 10 到 1500,PSNR 先升后降:10 的时候太低,几乎不区分可见度,正则把能管的都管了,PSNR 25.95 且存储 139MB;500 处最高 25.99;到 1500 又回落到 25.92,存储降到 87MB。存储一路降好理解,σ 越大,被正则"收编"成高斯形的图元越多,纹理越稀疏越好存;PSNR 不单调则说明正则和质量的张力:正则太狠,把本该有细节的纹理也推成了高斯形,画面信息被删掉。500 正好是"管住该管的、不碰不该碰的"那个平衡点。

纹理尺寸那张表(Table 7)更有意思,它把"单图元表达力对图元数"的权衡摊开了。四个档位固定参数总量 40.96M(单纹理通道):8² 配 640K 图元,单图元弱但数量足;64² 配 10K 图元,单图元强但数量少。结果 8² 的 PSNR 26.04 竟然比 16² 的 25.99 略高,但存储 207MB 贵一倍。64² 掉到 23.34 是硬伤:10K 个图元根本盖不住场景,纹理再细也没用。16² 作为折中,质量接近最优、存储合理、图元数 160K 足够做密度控制。纹理分辨率不是越高越好,它和场景覆盖率是跷跷板,这是"纹理是有限预算"的直接教训。

10边界与反例:八个它扛不住的时刻

第 7 章全是赢面,这一章把输面一次摆清。八条,按严重程度排。

1. 户外大场景落后:树叶类细节不是纹理的菜。 Mip-NeRF-360 户外场景 BBSplat 全面落后(Table 9 逐场景:Bicycle LPIPS 0.3096 vs 3DGS-MCMC 0.3652 勉强赢,Garden 0.1907 vs 0.2974 赢,但 PSNR 均落后;Stump 0.3376 vs 0.3311 输)。论文自己的解释是:大量细小单色细节(叶子)更适合高斯图元逐个堆,纹理图元在"小而密"面前没有优势。室内场景(Room/Kitchen/Bonsai)BBSplat 全胜,正是纹理的主场。

树叶为什么难住纹理图元,机制上要算一笔。一片树冠是几千片小叶子,每片叶子的形状、朝向、遮挡都不同。对高斯系来说,这是它最擅长的分布,一个椭球对应一片叶子,数量管够就堆出来了。对纹理图元来说,一张 16² 的纹理想表达"一片叶子"太奢侈,一个图元盖住一大片树冠,纹理只能画出一团平均的绿色,细节全糊。而且树冠是深度连续变化的立体区域,平面图元的贴合优势在这里发挥不出来。Mip-360 的 PSNR 全面落后正是这个机制的结果,LPIPS 勉强赢说明感知质量没有崩,但像素级的精确对位做不到。

2. 训练慢 8 倍。 论文明说:约 40 分钟拟合一个场景,3DGS 只要 5 分钟。瓶颈是纹理反传:每个像素的梯度都要按双线性权重分摊回四个纹素。虽然仍远快于 NeRF,但对要求快速迭代的应用是硬伤。

40 分钟的构成和第 4 章的反传链路直接相关。前向多出来的只有采样和求交,量不大;反传才是重头:每个像素的每个采样点,梯度要按双线性权重分给四个纹素,还要算一份对 (u,v) 的梯度再经矩阵回流到图元位姿。一次迭代里这个操作被重复几十万次(图元数乘以覆盖像素数),累计开销就把单次迭代拉到 3DGS 的八倍。3DGS 没有纹理,它的梯度走解析公式,代价是几个浮点运算;BBSplat 的梯度要写纹理、写位姿,两条支路都要写显存。这个差距是结构性的,不是实现可以补回来的。

3. 户外场景图元一多就过拟合。 和大图元档的 Mip-360 结果直接相关:图元数上到 400K,纹理开始死记训练视角。

过拟合的连锁反应要讲完整:户外场景图元数繁殖到 400K,每个图元一张 16² 纹理,参数总量冲到几亿,而监督还是那几百张照片。正则的力度(λ=1e−4)此时已经压不住,纹理开始把训练视角里的具体像素分布抄进去,新视角的渲染就出现噪声和重影。3DGS 系方法在相同图元数下没有这个问题,因为高斯的参数是连续的,不容易精确记忆某个视角;纹理是离散的字节串,记忆能力天生更强。这是"表达力强"的另一面,正则能缓解,但不能根治。

4. 帧率没有优势。 第 7 章登记过:28–47 FPS 对 3DGS 的 299–441。纹理采样加逐纹素 alpha 合成的开销是结构性的,实时场景要慎重。

5. mesh 精度没全面赢 2DGS。 CD 0.91 vs 0.80。BBSplat 的卖点是打包(渲染+网格+存储),单拎网格这一项,2DGS 仍是最准的。

CD 差的 0.11 从哪来,可以猜但论文没说死:2DGS 的透明度是解析的钟形,深度计算完全平滑;BBSplat 的 alpha 纹理是离散的,采样出的透明度在边缘有量化台阶,TSDF 融合时这些台阶会在等值面上留下微小起伏。另外 BBSplat 的图元有纹理细节,深度图渲染时混入了纹理层的噪声。论文不避讳这个差距,它想卖的是"三合一"而不是"单项冠军":渲染 29.72、存储 32MB、网格 0.91,三项打包没有对手。

6. ray-tracing 效果只在离线。 Blender 里的重光照、镜面是离线渲染;StopThePop 排序只用于可视化。训练管线和在线渲染没有这些。

这条边界的实际影响是:第 8 章那套"能编辑的资产"适合离线制作管线(游戏资产、影视道具、产品展示),但不等于在线实时应用能直接用。把 BBSplat 场景搬进实时引擎,还是要先转成普通网格加贴图,ray-tracing 的便利在离线侧兑现。

7. 对比的干净程度打折。 Table 1/2 的 BBSplat 指标用了 2DGS 深度正则(公平对比);Texture-GS 只在 DTU 上比,因为它处理不了大场景。读表时这两点要记在心上。

"2DGS 深度正则"是什么要说清:2DGS 自己训练时用了深度正则来规范几何,BBSplat 复用时也带上它,是为了让两边的训练条件对齐,防止被质疑"BBSplat 占便宜"。Table 1/2 里带 † 的 2DGS 是不带深度正则的版本,指标更低,对比时看哪个版本心里要有数。Texture-GS 只在 DTU 比则是有意的裁剪,因为它的球形纹理空间装不下大场景,硬比等于逼它犯规。

8. 纹理分辨率是硬上限。 16² 意味着每个图元的空间细节最多 16×16 纹素,高频细节只能靠加图元,不能靠加分辨率。球谐阶数论文也没公开,复现参数不完整。

这条边界和第 9 章的 Table 7 是同一枚硬币的两面:16² 是从质量、存储、图元数三方权衡出来的,但它同时框死了单图元的分辨率上限。一个图元想画更细的纹理,只能靠分裂出更多图元去分摊,不能靠加大 ST,因为 ST 加大就要牺牲图元数(总参数预算固定)。想突破只能改设计,比如给纹理加多分辨率、或者让 ST 随场景自适应,论文把这些留给 future work。复现侧还有个隐性缺口:球谐阶数没有公开,同样是复现 BBSplat 的人会发现这两处参数要靠猜。

这八条合起来是一幅诚实的画像:BBSplat 是"室内、中小场景、存储敏感、可离线"场景的优选,不是实时全场景的万能解。

11贡献块

这一篇的贡献(精读视角)
  • ① 文本化平面图元:提出可学习的带纹理平面图元(RGB 纹理 + alpha 纹理),用光度损失即可端到端训练,可作 3DGS 系管线的 drop-in 替换;在较少图元下渲染质量全面超过 2DGS 与 3DGS,DTU 拿到 29.72 的 SOTA PSNR。
  • ② 可靠的网格提取:同一份参数可直接提取优于 3D 高斯系方法的网格(Chamfer Distance 0.91,对比 3DGS 1.96、SuGaR 1.33),兼得高质量渲染——"能画"与"能抽网格"第一次被同一批图元同时拿下。
  • ③ 存储专项压缩:稀疏正则加量化加字典压缩,实现对 3DGS 最高 ×17 的存储缩减(7MB 对 121MB),且质量不降反升——省存储不是靠牺牲质量,是文本化表示的附带红利。
  • 把三条串起来是一条因果链:纹理承载形状(①)→ 平面贴合表面(②)→ 纹理天然稀疏可压(③)。BBSplat 不是给 3DGS 打了三个补丁,而是把"图元表达力"这件事重新选了一次型。

12原文出处块

原文出处
标题
BillBoard Splatting (BBSplat): Learnable Textured Primitives for Novel View Synthesis
作者
David Svitov、Pietro Morerio、Lourdes Agapito、Alessio Del Bue
机构
Università degli Studi di Genova / Istituto Italiano di Tecnologia / University College London
发表
arXiv:2411.08508v4 [cs.CV](ICCV 2025)
PDF 链接
arXiv:2411.08508 [cs.CV]
许可
CC BY:open access,作者已对接受的手稿版本应用 CC BY public copyright license;arXiv 全文非独占分发,本站站内托管并标注 arXiv。
使用说明:本站为非商业性技术内容分区,不挂咨询入口、广告与联盟链接。本稿引用的 9 张原图原样使用并逐图署名(图号 + 页码 + 版权 + 未修改声明),不做重绘、不加中文标注、不裁切拼接、不施滤镜。原文文字只做简短引用(摘要为原样引用并标注页码)。如需转载图片,请按 CC BY 条款署名原作者。