3D Gaussian Splatting 渲染过程

给定一组三维高斯点,渲染步骤大致为:1.camera space转成ray space 2.对像平面进行分块,然后对高斯排序 3.正投影发出射线进行α-blending

1. camera space->ray space,3D Gaussian->2D Gaussian

这个步骤将NeRF中的投影过程变为了正投影,引入了ray space的概念,让3D Gaussian 变为2D Gaussian.

  • 透视投影和正投影                   

一般的渲染过程都是透视投影,所有发出的ray都从camera发出,故而有个交点。splatting的方法则是用正投影,发射的ray全部平行于像平面。

3D Gaussian splatting的前期步骤就是将camera space转成ray space,本质就是将透视投影转变为正投影,让3D Gaussian转变为2D Gaussian,这样就免去了一大堆光线求交的计算。

  • ray space

给定一个ray space的坐标点(x0,x1,x2),其中(x0,x1)代表该点透视投影到图像上的坐标点,x2代表视点即camera到该点的距离。

假如给定其对应的camera space坐标点为(u0,u1,u2),则两者转换为:

  • 3D Gaussian->2D Gaussian

 camera space->ray space 的变换有一个特点:非仿射变换。仿射变换是可以用一个统一的线性变换矩阵将所有点的坐标进行转换,而根据上面的两个式子可以发现,每个点的ray space坐标都是以自身的camera space坐标为自变量的非线性函数,故并没有一个统一的变换矩阵。

 为了解决这个问题,作者采用了一个近似的方法,即用每个三维高斯的中心点的变换矩阵近似为各自的变换矩阵,这样对于每个高斯来讲,都是仿射的变换。而这个矩阵被称为雅可比矩阵J。

当然这样也使得每个高斯的大小不能太大,否则就会产生精度问题。

结合上述,则对于每个给定的三维高斯的协方差矩阵V'',以及其world space下的中心点坐标(u0,u1,u2),我们可以求得ray space下的高斯协方差。由于给的是world space下的坐标,所以得先乘以旋转平移矩阵W转化为camera space坐标,然后通过中心点坐标求出雅可比矩阵J,ray space下的高斯协方差就如下:

由于是正投影,故直接取最后的三维高斯协方差的前两行两列就是投影到像平面上的二维高斯协方差矩阵。 

二维高斯的中心点坐标就是camera space下的u0,u1除以第三维u2,即(u0/u2,u1/u2)

这样就将空间中的三维高斯转化为像平面上的二维高斯。

2. 分块排序  

为了渲染时能正确考虑到高斯之间的遮挡关系,需要对高斯进行基于深度的升序排序。

算法中还采用了分块的策略,将像平面分为16*16,每一块选取投影到这一块的二维高斯,对于覆盖多个块的高斯,每个覆盖块都会选取到它。然后每一块将选取好的高斯基于深度进行基数排序,得到距离像平面从近到远的16*16个各自排序好的高斯列表 。

对于为什么要分块,笔者猜测应该是为了渲染时能够减少计算量,否则每个像素颜色值可能根据所有高斯继续计算。

3. α-blending 

3D Gaussian splatting 也是对每个像素发出一条射线。

首先根据高斯的sh参数,得到高斯的颜色c

接着,计算高斯的不透明度alpha,即f(p),alpha要根据高斯的不透明度参数α以及像素点坐标和二维高斯中心的距离得到。