相关文档
3DGS
NeRF 和 3DGS 的区别

什么是 Splatting
定义
- 一种体渲染的方法:从 3D 物体渲染到 2D 平面
- Ray-casting 是被动的(NeRF)
- Splatting 是主动的
为什么选择 3D 高斯椭球
- 很好的数学性质
- 仿射变换后高斯核仍然闭合
- 3D 降维到 2D 后(沿着某一个轴积分(z 轴))仍然为高斯
- 定义:
G(x)=2πk∣Σ∣1e−21(x−μ)TΣ−1(x−μ)
- 其中Σ表示协方差矩阵,半正定,∣Σ∣是其行列式,μ表示均量
3D gaussian 为什么是椭球?
- 对于椭球高斯函数:G(x)=2πk∣Σ∣1e−21(x−μ)TΣ−1(x−μ)来说,2πk∣Σ∣始终是一个常数,变量只存在于−21(x−μ)TΣ−1(x−μ)中,当(x−μ)TΣ−1(x−μ)=constant时,其可以展开为
constant=(x−μ)TΣ−1(x−μ)=σx2(x−μx)2+σy2(y−μy)2+σz2(z−μz)2−σxσy2σxy(x−μx)(y−μy)−σxσz2σxz(x−μx)(z−μz)−σyσz2σyz(y−μy)(z−μz)equalto:Ax2+By2+Cz2+2Dxy+2Exz+2Fyz=1
其中,
Σ=σx2σxyσxzσxyσy2σyzσxzσyzσz2
最终就是一个椭圆面的表示形式。而(x−μ)TΣ−1(x−μ)是有取值范围的,所以整体表现出来就是一个实心的椭球体
如何利用旋转和缩放计算协方差矩阵
对应于 cuda 代码中的 computeConv3D
- 高斯分布:
- x∼N(μ,Σ)
- 均值:μx,μy,μz
- 协方差矩阵:Σ=σ∗x2σ∗yxσ∗zxσ∗xyσ∗y2σ∗zyσ∗xzσ∗yzσz2
- 高斯分布的仿射变换:
- w=Ax+b
- w∼N(Aμ+b,AΣAT)
- 协方差和 b 没有关系
- 标准高斯分布:
-
x∼N(0,I)
-
均值:0
-
协方差矩阵:Σ=100010001
-
Σ=A⋅I⋅AT 任意高斯可以看作是标准高斯通过仿射变换得到
- A=RS,其中R是旋转矩阵,S是缩放矩阵,因此
Σ=A⋅I⋅AT=RSSTRT
Splatting 过程介绍——从 3D 到像素
变换矩阵介绍
观测变换

- 从世界坐标系到相机坐标系,仿射变换
- w=Ax+b
投影变换
- 3D 到 2D
- 透视投影,和 Z 轴有关
- 正交投影,和 Z 轴无关

正交投影
- 对于一个立方体[l,r]×[b,t]×[f,n],将其平移到原点,然后缩放为[−1,1]×[−1,1]×[−1,1]的正方体
- 投影矩阵:
2/(r−l)00002/(t−b)00002/(n−f)00001100001000010−(r+l)/2−(t+b)/2−(n+f)/21

透视投影
- 有远小近大的原则,投影出来是一个锥体。因此需要先把锥体压成立方体,然后再进行正交投影

Mpersp−>ortho=n0000n0000n+f−100−nf0
视口变换
- 不管是透视投影还是正交投影,最终得到的都是[−1,1]3范围内的立方体,然后进行视口变换将其映射回图片的大小 height * width,恢复出原始比例
Mviewpoint=2w00002h0000102w2h01
3D 高斯的观测变换过程,如何把物理坐标系的物体映射到像素空间
对应代码中的 computeCov2D
第一步:从物理坐标系到相机坐标系
- 物理坐标系:
- 高斯核的中心点:tk=[tx,ty,tz]T
- 高斯核对应的高斯分布:rk,,(t)=GVk,,(t−tk)
- 其中Vk,,是协方差矩阵
- 相机坐标系:
- 高斯核中心:μk=[μx,μy,μz]T
- 高斯核对应的高斯分布:rk,(t)=GVk,(μ−μk)
- 均值:μk=Wtk+d
- 协方差矩阵:Vk,=WVk,,WT
- 这一步就是简单做个仿射变换,3D 空间的坐标变换
第二步:从相机坐标系到像素空间
- 相机坐标系:
- 高斯核中心:μk=[μx,μy,μz]T
- 协方差矩阵:$V_k^{, }
- 投影变换:(非线性的变换,需要做泰勒展开做局部的线性近似)
- 高斯核中心:xk=[xx,xy,xz]T
- 高斯核对应的高斯分布:rk(t)=GVk(x−xk)
- 均值:xk=m(μk)(对均值可以直接做非线性变换,不需要局部线性近似)
- 协方差矩阵:Vk=JVk,JT
- 其中J=∂μ∂m(μk),雅可比矩阵
- 至此,协方差矩阵Vk=JWVk,,WTJT
如何求得雅可比矩阵?
Mpersp−>ortho=n0000n0000n+f−100−nf0
- 视锥中一个点:[xyz1]T对其应用投影变换后:
x1x2x31=n0000n0000n+f−100−nf0xyz1=nxny(n+f)z−nfz=znxzny(n+f)−znf1
J=dxdf1dxdf2dxdf3dydf1dydf2dydf3dzdf1dzdf2dzdf3=zn000zn0−z2nx−z2ny−z2nf
3D 高斯球的颜色表示
这里是把高斯椭球的颜色表示成了一个颜色球,这个颜色球从不同角度观察,都可以看到不同的颜色。但是颜色球的颜色应该怎么描述呢?这里就是使用球谐函数来对其做近似,然后从不同角度对其做渲染

球谐函数介绍
- 任何一个球面坐标的函数,都可以用多个球谐函数来近似
- f(t)≈∑l∑m=−llclmylm(θ,ϕ)
- 其中,l表示当前的阶数,clm是各项系数,ylm是基函数

f(t)=≈l∑m=−l∑lclmylm(θ,ϕ)c00y00+c1−1y1−1+c10y10+c11y11+c2−2y2−2+c2−1y2−1+c20y20+c21y21+c22y22+...
y00=4π1y1−1=4π3ryy10=4π3rz...
- 由此,当 xyz 固定时,基函数就是固定的,但是系数是变化的。当系数维度为 3 时,共有 16 个系数,即一个高斯球,有 16 个颜色系数要估计
使用α -blending 计算像素的颜色
与 NERF 中公式相同
C=Tiαici=i=1∑NTi(1−e−σiδici)where:Ti=r−∑j=1i−1σiδj
- 其中:
- Ti:在 s 点之前,光线没有被阻挡的概率
- αi:在 s 点处,光线被遮挡的概率。包含两点:1. 高斯椭球本身的不透明度;2. 该像素点距离高斯椭球中心越远,高斯椭球对其影响越小
- ci:在 s 点处,高斯球的颜色。即通过球谐函数近似得到的颜色
注意,此时是在 2D 平面上计算像素值
- 当一轮迭代之后,参数都固定了,此时就可以计算像素的颜色值。3D 高斯在投影到 2D 平面上后,还是一个高斯分布。利用之前的理论,当(x−μ)TΣ−1(x−μ)=constant时,在二维上表现为一个椭圆:σ12(x−μ1)2+σ22(y−μ2)2−σ1σ22σxy(x−μ1)(y−μ2)=constant。此时μ1和μ2为高斯中心点在像素平面上的坐标,σ1和σ2为二维高斯协方差矩阵对角线上的元素。
高斯椭球的自适应密度控制
- 这里使用 α 值来调控高斯函数的数量,以防止在优化过程中创建过多的高斯函数。α 值的调整基于一个预定义的阈值,当高斯函数的数量超过这个阈值时,就会使用剔除机制来移除那些贡献较小的高斯函数。(这里可以仔细在源码里找找)
- 此外,为了处理小规模几何结构的不足重建问题,采用了复制(在重建不足的区域)和分裂(在过度重建的区域)高斯函数的策略。这些操作使得优化过程能够更精细地调整高斯函数的分布,以更精确地匹配场景的几何结构。具体地,这个过程包括以下步骤:
- 在重建不足的区域,如果小尺度的几何特征没有被足够覆盖,算法会克隆现有的高斯函数,即复制一个相同的高斯函数以增加局部密度,从而更好地捕捉细微的细节。
- 对于过度重建的区域,如果小尺度的几何被一个大的高斯函数所覆盖,算法会将其分裂为两个较小的高斯函数,这样可以减少单一高斯函数覆盖过多细节的情况,避免模糊和不必要的重叠。
- 这种自适应的密度控制策略不仅可以增加细节的丰富性,也有助于避免过多的高斯函数对计算资源的消耗。α 值的动态调整和高斯函数的合理分布,使得模型在不同的迭代中逐渐收敛,最终得到一个既紧凑又精确的 3D 场景表示。
- 优化过程中,通过增加 α 值来提高某些高斯函数的重要性,同时允许采用剔除方法来移除那些低于预设 α 阈值的高斯函数。尽管高斯函数可能会随着优化过程中的调整而增大或缩小,并与其他高斯函数产生重叠,但作者定期进行重建和调整,以确保在视觉空间中保留有重要贡献的高斯函数,同时优化整体的几何表现。
- 通过这种方法,3D Gaussians 作为欧几里得空间中的基元,在所有时间内都保持一致,与其他方法(如基于投影或扭曲的策略处理大型高斯函数的方法)相比,这种方法避免了复杂的变换,使得渲染过程更加直接和高效。
代码解析
diff-gaussian-rasterization 解析

预处理
1 2 3 4 5 6 7 8 9 10 11 12
|
preprocessCUDA<NUM_CHANNELS> << <(P + 255) / 256, 256 >> > (
P, D, M, means3D, scales, rotations, opacities, ... );
|

剔除视锥外的点
1 2 3 4 5 6
| __global__ void preprocessCUDA(int P, int D, int M, const float* orig_points, const glm::vec3* scales, ...) {
}
|
计算高斯核对应的 tile
其他
名词解释:
- EWA:
- NDC 坐标系:Normalized Device Coordinates,标准化设备坐标系
- footprint(足迹):椭球投影到 2D 平面上的扩散
- NVS: novel view synthesis,新视角合成
常见疑问
- 为什么 3d 高斯降维到 2d?
- 因为 splatting 算法就是要把 3d 的 voxel 投射到像素屏幕然后做叠加
- 怎么降到 2d?
- 为什么选择高斯?
- 因为高斯变成 2d 还是高斯,协方差矩阵直接拿掉 3 行 3 列即可(这个相当重要,直接省略了积分了!!!!)
- 为什么协方差矩阵不用做平移缩放?
- 感觉应该是 splatting 在投影矩阵之后的那个空间里做,点要做视口变换是为了和后面的像素匹配,做后面的 tile 渲染
参考文档