3DGS 3. 体渲染

§ 参考资料 共 5 条

NeRF 中,整个场景用一个函数隐式表示,在渲染时,通过对这个隐式函数积分来求出每一个像素的颜色值,这样的方法被称为 backward mapping

而 3DGS 使用高斯椭球描绘整个场景,渲染时对高斯椭球进行类似传统图形学的变换,最后在变换后的空间中进行类似光栅化的操作,这被称为 forward mapping

而这两种方法都需要用到体渲染

体渲染主要是为了解决云、烟、果冻这类非刚性物体的渲染建模,为了建模这种非刚性物体的渲染,体渲染把气体等物质抽象成一团飘忽不定的粒子群。光线在穿过这类物体时,其实就是光子在跟粒子发生碰撞的过程

体积通常表示为微小的微分圆柱体,用 $L$ 来表示入射或出射光子数量,$L_i$ 表示入射光量,$L_o$ 表示出射光量。它其实就是 radiance

在一个粒子群中,光子与粒子发生的作用可以分为四种:

  • 吸收(absorption):光子被粒子吸收
  • 放射(emission):粒子本身释放光子
  • 外散射(out-scattering):光子撞到粒子后可能弹射到其他方向
  • 内散射(in-scattering):其他方向的光子被弹射到当前方向

img

入射光与出射光之间的变化量由这四部分组成,即:

$$ \mathrm dL(x,\boldsymbol\omega) = \text{emission} + \text{in-scattering} - \text{out-scattering} - \text{absorption} $$

其中,$\boldsymbol \omega$ 是摄像机朝向,由于光线从远处向摄像机发射,$x$ 表示当前位置距离粒子群入口的距离

吸收与吸收系数

在吸收部分,一个重要的参数是吸收系数 $\sigma_a$,它表示光在介质中传播每单位距离被吸收的概率密度,单位是距离的倒数

如果只考虑吸收,那么会有:

$$ \mathrm dL=-\sigma_aL(x,\boldsymbol\omega)\mathrm dx $$

解这一个常微分方程可以得到:

$$ L(x,\boldsymbol\omega)=e^{-\sigma_ax}L(0,\boldsymbol\omega) $$

这叫做比尔——朗伯定律

外散射与消光系数

外散射也有一个系数 $\sigma_s$ 叫做散射系数,与吸收系数基本相同,散射系数描述了光子在单位距离内被散射的概率,对内外散射相同

仍然可以写出一个相似的方程:

$$ \mathrm dL=-\sigma_sL(x,\boldsymbol\omega)\mathrm dx $$

吸收和外散射部分加起来被称为消光系数,记作 $\sigma_t$,即:

$$ \sigma_t=\sigma_a+\sigma_s $$

如果同时考虑吸收和外散射,那么有:

$$ \mathrm dL=-\sigma_tL(x,\boldsymbol\omega)\mathrm dx $$

对于非均匀介质来说,消光系数(和散射系数)可能随位置不同而不同,即称为一个函数 $\sigma_t(x)$,此时可以写出一般形式的方程:

$$ \mathrm dL=-\sigma_t(x)L(x,\boldsymbol\omega)\mathrm dx $$

解出来就是:

$$ L(x,\boldsymbol\omega)=e^{-\int_0^x \sigma_t(s)\mathrm ds}L(0,\boldsymbol\omega) $$

内散射

碰上粒子的光子有概率向各个方向弹射,设与入口距离为 $x$,入射方向为 $\boldsymbol i$,出射方向为 $\boldsymbol o$,那么概率可以写成一个函数 $f_p(x,\boldsymbol i,\boldsymbol o)$

这叫做相位函数,它满足对称性,即 $f_p(x,\boldsymbol i,\boldsymbol o)=f_p(x,\boldsymbol o,\boldsymbol i)$

那么内散射对应的方程即:

$$ \mathrm dL=\sigma_s(x)\left[\int_{\mathbb S^2}f_p(x,\boldsymbol\gamma,-\boldsymbol\omega)L(x,\boldsymbol\gamma)\mathrm d\boldsymbol\gamma\right]\mathrm dx $$

我们把右侧的积分记为 $L_s(x,\boldsymbol\omega)$,即:

$$ L_s(x,\boldsymbol\omega)=\int_{\mathbb S^2}f_p(x,\boldsymbol\gamma,-\boldsymbol\omega)L(x,\boldsymbol\gamma)\mathrm d\boldsymbol\gamma $$

加上之前的吸收和外散射,方程就变成了:

$$ \frac{\mathrm dL}{\mathrm dx}=-\sigma_t(x)L(x,\boldsymbol\omega)+\sigma_s(x)L_s(x,\boldsymbol\omega) $$

放射

放射部分仍然与 $\sigma_a$ 有关,参考 https://zhuanlan.zhihu.com/p/595117334

一般用 $\sigma_a$ 乘上一个 $L_e$ 表示放射部分,方程就变成了:

$$ \frac{\mathrm dL}{\mathrm dx}=-\sigma_t(x)L(x,\boldsymbol\omega)+\sigma_s(x)L_s(x,\boldsymbol\omega)+\sigma_a(x)L_e(x,\boldsymbol\omega) $$

这是一个 $y'+p(x)y=q(x)$ 形式的微分方程,代入通解:

$$ y(x) = \left[\int_0^xq(t)e^{\int_0^tp(t')dt'} dt + C\right] e^{-\int_0^xp(t)dt} $$

可以得到:

$$ L(x,\boldsymbol\omega)=\left[\int_0^x[\sigma_s(t)L_s(t,\boldsymbol\omega)+\sigma_a(t)L_e(t,\boldsymbol\omega)]e^{\int_0^t\sigma_t(t')\mathrm dt'}\mathrm dt+L(0,\boldsymbol\omega)\right]e^{-\int_0^x\sigma_t(t)\mathrm dt} $$

这就是体渲染方程

3DGS 中的相机空间与射线空间

高斯椭球从世界空间(源空间)先变换到相机空间,然后再变换到射线空间

  • 世界空间与相机空间与传统图形学中概念相似,这是一个仿射变换
  • 从相机空间到射线空间的变换在传统图形学中类似投影变换,属于非仿射变换

相机空间与射线空间的概念与传统图形学有所不同

在相机空间中,一个点 $(x_0,x_1,x_2)^T$ 的各个坐标表示:

  • $x_0$:水平偏移(左右)
  • $x_1$:垂直偏移(上下)
  • $x_2$:深度(距离相机沿光轴的方向)

在针孔摄像机模型中,所有射线都从相机中心 $\boldsymbol o$ 发出,然后穿过一个固定的平面,通常定义在 $z=f$ 处($f$ 为焦距),这叫做像平面

在这里情况相似,对于相机空间中的点 $(x_0,x_1,x_2)$,我们可以用一个二维坐标表示 $\boldsymbol o$ 到该点的射线方向:

$$ \hat{\boldsymbol x}=\left(\frac{x_0}{x_2},\frac{x_1}{x_2}\right)^T $$

可以看成 $z=1$ 作为像平面,这样的话一个像素点 $(u, v)$ 就对应了相机发出的一条射线

我们可以将射线方向与该点与 $\boldsymbol o$ 的距离一起包起来,这唯一确定了三维空间中的一个点,这就是射线空间:

$$ \boldsymbol x=\left(\hat{\boldsymbol x},\Vert(x_0,x_1,x_2)^T\Vert\right)^T $$

论文中的示意图:

image-20251019232630047

3DGS 中的体渲染方程

我们让 $L(0,\boldsymbol\omega)=0$,即将背景项设为 $0$,那么渲染方程就可以写成:

$$ L(x,\boldsymbol\omega)=\int_0^x[\sigma_s(t)L_s(t,\boldsymbol\omega)+\sigma_a(t)L_e(t,\boldsymbol\omega)]e^{-\int_t^x\sigma_t(t')\mathrm dt'}\mathrm dt $$

我们令:

$$ S(x)=\sigma_s(x)L_s(x,\boldsymbol\omega)+\sigma_a(x)L_e(x,\boldsymbol\omega) $$

那么原方程就可以写成:

$$ L(x,\boldsymbol\omega)=\int_0^xS(t)e^{-\int_t^x\sigma_t(t')\mathrm dt'}\mathrm dt $$

由于上面的渲染方程采用的是从远到近的逻辑,而 3DGS 中采用由近及远的顺序,所以指数上换成 $-\int_0^t\mathrm dt'$

并且我们可以把 $S(x)$ 简化一下,认为它是 $\sigma_t$ 乘上某个东西,即:

$$ S(x)=\sigma_t(x)L_t(x,\boldsymbol\omega) $$

那么渲染方程就可以写成:

$$ L(x,\boldsymbol\omega)=\int_0^x\sigma_t(t)L_t(t,\boldsymbol\omega)e^{-\int_0^t\sigma_t(t')\mathrm dt'}\mathrm dt $$

和论文中的形式相同:

$$ \boxed{I_\lambda(\hat{\boldsymbol x})=\int_0^Lc_\lambda(\hat{\boldsymbol x},\xi)g(\hat{\boldsymbol x},\xi)e^{-\int_0^\xi g(\hat{\boldsymbol x},\mu)\mathrm d\mu}\mathrm d\xi} $$

其中:

  • $I_\lambda(\hat{\boldsymbol x})$ 表示投影平面中 $\hat{\boldsymbol x}$ 这个像素点的光强
  • $c_\lambda(\hat{\boldsymbol x},\xi)$ 表示射线空间中 $(\hat{\boldsymbol x},\xi)$ 这个点粒子的颜色或 radiance,在 3DGS 中由 SH 系数决定
  • $g(\hat{\boldsymbol x},\xi)$ 表示射线空间中 $(\hat{\boldsymbol x},\xi)$ 这个点的消光系数
  • $e^{-\int_0^\xi g(\hat{\boldsymbol x},\mu)\mathrm d\mu}$ 可以理解成“能到达相机的概率”
  • $\int_0^L\mathrm d\xi$ 表示从 $\boldsymbol o$ 开始一直积分到 $(\hat{\boldsymbol x},L)$ 处

也就是在射线空间中沿着 $\hat{\boldsymbol x}$ 表示的这条射线,在距离 $\xi$ 处,每一个粒子的 radiance 贡献,按其“能到达相机的概率” $e^{-\int_0^\xi g}$ 加权并累加

它在形式上退化成了无散射,仅放射/吸收的模型