EWA Volume Splatting 笔记
3dgs
ewa
volume-splatting
EWA Volume Splatting
这篇论文是3dgs前置知识,把如何投影3D Gaussian到屏幕空间讲得非常详细.
在 3dgs 中,我们不用传统的三角形网格来建模世界,而是用无数个”云雾状的斑块”来拼凑,这些斑块就是三维高斯 (3D Gaussian),把它想象成一个半透明的软糖或者一团形状规则的烟雾.它的中心最浓(最不透明),越往边缘越淡.
预备
高斯球
协方差矩阵用于描述高斯椭球的形状
先想象一个2d的高斯椭球
对角线上的元素是 和 (方差).
- 左上角的 :控制高斯椭球形状在 X 轴(水平方向)有多宽.数字越大,形状越宽.
- 右下角的 :控制高斯椭球形状在 Y 轴(垂直方向)有多高.数字越大,形状越高.
如果这个矩阵只有对角线上有数字,其他地方都是 0,例如 ,那么这就是一个完全正放着的椭圆(水平特别长,垂直比较扁),没有任何倾斜.
非对角线上的元素是 和 (协方差).
- 如果是正数(>0):意味着 X 变大的时候,Y 倾向于变大.高斯椭球在图形上会被向右上角和左下角拉扯,形成一个向右倾斜(/ 形状)的椭圆.
- 如果是负数(<0):意味着 X 变大的时候,Y 倾向于变小.高斯椭球在图形上会被向右下角和左上角拉扯,形成一个向左倾斜(\ 形状)的椭圆.
在 3DGS 中,高斯椭球变成了立体的,矩阵也就变成了 :
- 对角线3个数字:控制它在 X,Y,Z 三个绝对轴向上的长,宽,高.
- 其余位置6个数字:控制这块高斯椭球在各个平面(XY面,XZ面,YZ面)上的倾斜拉扯,综合起来,就决定了这块 3D 高斯核在空中的任意旋转姿态.
坐标变换
在 3D 渲染里,把一个高斯球画到屏幕上,需要做四次坐标变换
- 物体空间:只考虑了形状
- 世界空间:有一个绝对的中心点,所有物体都有了统一的位置参照
- 相机空间:摄像机的镜头成为新的宇宙原点
(0,0,0),摄像机的正前方通常是 Z 轴,整体就变成了一个相对坐标. - 屏幕空间:屏幕的坐标,只有二维
把相机空间的点 投射到屏幕上,需要经历”近大远小”的透视除法:,.这个”除以 ”的操作是非线性的,高斯分布经过非线性的变化就不再是高斯分布了,那么我们就没法利用高斯公式快速算颜色,整个 3dgs 算法就崩盘了.
正文
这篇论文的核心目标非常明确:提出一种基于椭圆高斯核的抛雪球(Splatting)体渲染新框架,既要解决渲染时的锯齿问题,又要用极低的计算成本实现完美的透视投影.
EWA Volume Splatting 的四大核心步骤
- 定义世界(数据建模): 把离散的体数据变成一个个连续的”发光吸收球”(重建核).
- 空间跃迁(坐标系变换): 把这些球从它们自己的坐标系,搬到摄像机的坐标系,最后搬到适合投影的”光线空间”.
- 降维打击(积分与抗锯齿): 在光线空间把 3D 的球拍扁成 2D 的”足迹(Footprint)”,并加上 EWA 滤波器防止锯齿.
- 画面合成(混合渲染): 把屏幕上所有拍扁的 2D 足迹按照前后顺序叠加上去,得到最终的图像.
重建核模型
作者假设,我们要渲染的一团云雾,一根骨头或者一个大脑,其实是由无数个微小的颗粒组成的.每个颗粒不仅自己会发光,还会挡住别人发出的光.
在这个物理模型下,论文引入了两个关键概念:
- 重建核 (Reconstruction Kernel, ): 作者特别强调,他们使用的是椭圆高斯核 (Elliptical Gaussian Kernels).这意味着这个颗粒的密度分布符合高斯函数(中心最浓,边缘渐淡),而且它可以是任意椭球形状的,不一定非要是正圆球.
- 消光函数 (Extinction Function, ): 这代表了光线穿过这堆高斯球时被遮挡的速率.论文假设,整个空间的遮挡情况,就是把所有这些独立的颗粒(重建核)叠加在一起算出来的.公式写成这样:
注:这里的 是系数,可以理解为这个高斯球固有的不透明度属性.
论文首先将输入的 3D 数据(无论它是规则网格还是不规则网格)统统转化为了数学上可以通过矩阵控制形状的三维椭圆高斯函数集合.
坐标系变换
把高斯核从物体空间搬到相机空间,假设高斯核原来的形状(方差矩阵)是 .摄像机有一个包含旋转和平移的观察矩阵 .经过变换在相机空间的新形状 就变成了:
从相机空间进入光线空间.在真实的相机空间里,透视原理导致光线是从镜头中心呈扇形发射出去的(发散的).如果我们在这个空间里顺着光线去压扁高斯核,每一根光线的方向都不一样,数学公式会变得极其庞大且无法计算.
作者想了一个天才的招数:能不能把原本像扇子一样发散的空间,扭曲成一个所有光线都完全平行的空间?这个光线平行的空间,就是光线空间 (Ray Space)!在这个空间里,所有的视线都变成了绝对平行的直线(平行于 轴).
这个空间转换映射 依然包含了除以深度 Z的操作,它是非线性的!如果直接转,高斯核又会扭曲变形,不再是高斯了.
既然整体的空间扭曲是非线性的,那我就只盯住这个高斯核的中心点 .在这个极小的局部范围内,用切线算出一个雅可比矩阵 .我用这个直勾勾的矩阵 ,去近似代替那个弯曲的空间转换.通过这个局部线性的雅可比矩阵 ,我们终于把高斯核安全地,不变形地送进了”光线空间”.它在光线空间的新形状(方差矩阵 )变成了:
或者连着上一步一起写(也是论文里的核心公式 20):
积分与抗锯齿
在光线空间里,我们的视线沿着 轴(深度方向)看过去.要把这个立体的高斯核变成屏幕上的 2D 斑点,数学上需要沿着 轴对 3D 高斯体进行积分.
高斯分布有一个特性,沿着一个维度对 3D 高斯求积分,结果是一个完美的 2D 高斯!
而且,计算这个 2D 形状的矩阵 简单粗暴到了极点.
取出光线空间里的 协方差矩阵 ,直接砍掉最后一行和最后一列(即深度维度),剩下的那个 矩阵,就是这颗高斯核在屏幕上的 2D 足迹 (Footprint)!
想象一下,如果这个高斯核离摄像机非常非常远,根据“近大远小”,它在屏幕上被拍扁后的 2D 矩阵 会变得极其微小.如果它缩小到连屏幕上的 1 个像素都填不满,图形学的像素网格就会“漏掉”它.当摄像机移动时,这个像素点就会疯狂闪烁,这就是极其难看的走样现象.
作者借鉴了信号处理的思想:无论离得有多远,被缩得有多小,我们都必须让它不小于 1 个像素.这就是一个单位大小的 2D 屏幕高斯核,论文里叫低通滤波器 (通常就是一个简单的单位矩阵 ).
在数学上,把这个极小的足迹和这个单位核融合,就等同于把两个矩阵直接相加!
所以,最终用于在屏幕上画图的 EWA 重采样滤波器(最终版 2D 高斯核形状)是:
光栅化与画面合成
我们虽然有协方差矩阵 ,但高斯分布的原始概率密度公式里,指数部分用的是协方差矩阵的逆矩阵.
所以,代码里要做的第一件事,就是求 的逆矩阵,论文里把它叫做 Conic Matrix(圆锥曲线矩阵) :
假设这个 2D 高斯核在屏幕上的中心点是 ,对于屏幕上的任意一个像素点 ,我们先算出它距离中心的偏移量:.然后,用刚才算出来的逆矩阵 ,计算一个叫径向指数 的标量值:
如果 相同,说明这些像素在同一个同心椭圆上.对于圆来说,这其实就是距离的平方.
最后,把这个径向指数扔进指数函数里,就能算出这个像素应该被染上多浓的颜色:
像素离中心越近, 越小,算出来的强度越接近 1(最不透明);离得越远,强度呈指数级迅速衰减到 0.
GPU 不能傻乎乎地去算屏幕上的每一个像素,那太慢了.因为高斯函数衰减极快,论文指出(也就是经典的” 原则”扩展),我们设定一个阈值 (论文中通常取 或更大).只要 ,算出来的颜色强度就基本为 0 了,直接抛弃不画!基于此,算法会为这个倾斜的椭圆计算一个严格对齐像素网格的矩形包围盒 (Axis-Aligned Bounding Box).GPU 只需要遍历这个包围盒里面的像素就行了.
当成千上万个高斯高斯核都被拍扁,切出包围盒,算好每个像素的强度后,最后一步就是把它们按照从后往前(或者从前往后)的顺序叠起来.
这就是图形学里最基础的 Alpha 混合:
这里的 就是高斯核本身的不透明度系数乘以刚才算出来的像素 .
降维
3DGS 需要的 EWA 投影流程已经走完了,但是作者还做了个数学优化.
如果我们把这颗 3D 高斯核在某一个方向(比如法线方向)无限压扁呢?论文设法向缩放因子为 .当 时,3D 的高斯核就在数学上严丝合缝地退化成了一个极其扁平的 2D 表面飞盘 (Surface Splat).
这意味着这套 EWA 框架完成了大一统!它不需要写两套代码.同一个底层公式,既可以渲染半透明的体数据(比如云雾),当把某一个轴向的方差矩阵压到极限时,又可以完美渲染出具有极其锐利边缘的固体表面(Surface)!