图形学中的辐射度


写在前面

  光线追踪中最基础的部分是光线的传播和反射(一般把表面双向透射分布函数[BTDF]和双向反射分布函数[BRDF]统一处理为 BSDF,即双向散射分布函数),辐射度测量学则提供了相关数学概念,构成了基于物理渲染算法推导过程的基本内容。
  本文使用和 PBRT 相同的左手系,即球坐标中 \phi 表示范围为 [0,2\pi) 的旋转角,方向以左手法则沿四指旋转为正;\theta 表示 [0,\pi] 的俯仰角,由上方向(本文默认为 z 轴)向平面倾斜的角度。但是,使用哪一种坐标系对渲染没有影响。

辐射度基本量值

  辐射度可以简单理解为光照的强弱程度,一般用一个变量 Spectrum 来表示,通俗的来说就是光照的 R,G,B 值。
  渲染中使用的量值一般有以下四种:通量(flux)、入(出)射辐射照度(irradiance/radiant exitance)、光强(intensity)和辐射亮度(radiance),以上所有的量值都是波长相关的,且由能量学推导而出。
  大家可能会感到迷惑,辐射照度和辐射亮度有什么区别?其实光从英文名字上就会发现真的非常相似,而国内的书籍都同样翻译成辐射度而已,但其实两者相差比较大,我刻意在名称上加以区分,关于网上的理解可以看[这里][1]。
  总的来说,辐射照度表示某一极小区域对所有可能方向发出或接收的功率,表示为功率对面积的微分:\Phi\over dA;辐射亮度表示该极小区域对特定方向发出或接收的功率,表示为功率对面积以及方向的微分:\Phi\over{dAd\omega},辐射亮度对所有方向光照功率的积分就表示辐射照度。
  更直白一些,计算机中能用 R,G,B 直接表示的一般都是辐射亮度,而辐射照度表示一个积分,毫不客气地说,解辐射照度积分几乎等同于解渲染方程。是不是还不太清楚?请先看下去。

能量

  能量用焦耳表示,光源发射光子会携带特定数量的能量和特定波长的光子。光子携带能量和波长的关系是

\displaystyle Q={hc\over\lambda}

  其中 c 表示光速(299,472,458\,m/s),h 表示普朗克常数(6.626 * 10^{-34}\,m^2kg/s

通量

  辐射通量又称为功率(power),表示单位时间内通过表面或者区域的所有能量,单位为瓦特(W)。辐射通量可以使用能量对时间的微分得到:

\displaystyle \Phi=\lim_{\Delta t\to0}{\Delta Q\over\Delta t}={dQ\over dt}

  通常来说,已知通量关于时间的函数,可以使用积分得到能量:

\displaystyle Q=\int^{t_1}_{t_0}\Phi(t)\,dt

  下图显示了光源的通量,针对围绕该光源的虚拟球体,虽然较大球体每单位表面积穿越的能量较少,但两个球体的全部通量相等

光源发出能量两个球体半径不同,通量相同

入射辐射照度和出射辐射照度

  已知一个有限的区域 A,可以定义该区域的平均能量密度E={\Phi/A}。辐射通量到达表面的密度时使用 irradiance(E)来表示,辐射通量离开表示时用 radiant exitance(M)来表示,上述单位均使用 W/m^2 表示。之所以称为辐射照度,通常用来表示光源对点 p 处的影响,表示所有光线到达物体表面 p 点(单位面积)所产生的的能量,经常需要使用蒙特卡洛方法来进行采样估计辐射照度(渲染方程)。在某种程度上,辐射照度表示功率概念,辐射亮度表示在某一个方向观察该功率点观察到的强度(亮度)。
  对于上图所示,外部球体上一点的入射辐射照度大于内部球体的入射辐射照量,当球体半径为 r 时,有

\displaystyle E={\Phi\over 4\pi r^2}

  而且,上式也表示了一个非常重要的现象:功率以平方距离衰减
  入射辐射照度和出射辐射照度也可以用通量相对面积的微分来表示:

\displaystyle E(p)=\lim_{\Delta A\to0}{\Delta \Phi(p)\over \Delta A}={d\Phi(p)\over dA}

  即
\displaystyle\Phi=\int_AE(p)\,dA

  回忆一下 Lambertian 定律,为什么在光栅化渲染中,着色时总要乘一个余弦值?因为到达表面的光线数量正比于光线方向和表面法相夹角的余弦值,即光照强度不变的情况下,两者面积之比为余弦值,自然两者的功率(辐射照度)之比为余弦值的倒数。
lambert_lawLambert定律。到达表面的辐射照度随光照入射夹角的余弦值变化

  对于面积为 A,通量为 \Phi 的光源,如果垂直向下照射有

\displaystyle E_1={\Phi\over A}
如果光源和表面呈现一定角度,则接收光照的表面积将要增加为 A/cos\theta,可以得到

\displaystyle E_2={\Phi cos\theta\over A}

立体角(solid angle)和光强

  还记得刚开始出现的 d\omega 吗?它表示立体角,可视为平面内二维角度值在球体角度的拓展,在单位球体上投影面积的大小,如下图所示

solid_angle对象 c 的立体角表示为:单位球上的投影面积,球体上最大为 4\pi,半球中最大为 2\pi

  注意,立体角始终表示的是球面度的概念。对于这个角度使用 \omega 来表示,而且立体角一般单位化后才有意义。在积分转换时,d\omega 可以当做 dxdydz 来看待,因为在球上任意取一点,它向切面的任意方向偏移,对 xyz 的总体影响是相同的(平方和仍为 1),这符合立体角的定义。
  为什么不是球面坐标?当向下偏移的时候 \phi 变大,而 \theta 不变,需要额外乘上 sin\theta 才能平衡,那么合起来有 \,sin\theta d\phi d\theta,固定 \,r = 1。而恰好有\,dxdydz=r^2sin\theta dr d\phi d\theta,将 r 代入就说明两组基的转换差一个 sin\theta
  对于被单位球面包围的点光源,可以轻易地得到往各个方向的光强:

\displaystyle I={\Phi\over 4\pi}
  对于通常意义上的光强,由通量相对立体角的微分得到:

\displaystyle I=\lim_{\Delta\omega\to0}{\Delta\Phi\over\Delta\omega}={d\Phi\over d\omega}

  即

\displaystyle\Phi=\int_\Omega I(\omega)\,d\omega

  通过前面的公式,光强又可以看做对一整块面积的辐射亮度的积分。即,光线从光源发出,撞击到某个区域的所有功率就称之为光强;辐射照度(功率)、辐射亮度、光强的联系一目了然了吧。

辐射亮度

  最后也是最重要的量值——辐射亮度(L),注意与辐射照度区分。辐射度表示单位面积单位立体角方向的功率,单位为 W/sr/m^2。请见如下定义:

\displaystyle L(p,\omega)=\lim_{\Delta\omega\to0}{\Delta E_\omega(p)\over\Delta\omega}={dE_\omega(p)\over d\omega}

  这里使用 E_\omega 表示垂直于 \omega 的辐射量。辐射度常常用来表示特定方向的光照功率大小,一般用来模拟反射光线以及符合 delta 分布的光源比如点光源,聚光灯,方向光等等。立体角将功率、立体角、面积联系起来,非正对面积需要考虑余弦项,如下所示:

\displaystyle L={d\Phi\over d\omega dA^\bot}={d\Phi cos\theta \over d\omega dA}

  其中,A^\bot 表示与 \omega 垂直的投影面积。
辐射度辐射度 L 定义为每单位立体角 d\omega 以及每单位投影面积 dA^\bot 的通量
 

  辐射度表达了极限情况下,“一根光线”的功率大小,符合一般认知,但是要知道,生活中没有绝对的符合 delta 分布的光源,而且反射模型往往需要模拟反射整个半圆的光线(蒙特卡洛方法)来求辐射照度,对于区域光源的采样,以及各种反射模型能量计算,辐射照度必不可少。

渲染积分

  渲染中经常需要进行辐射量值的积分运算,有许多积分工具可以对此类计算进行简化。下面介绍三个渲染中比较重要的辐射照度积分的例子。
  使用采样入射辐射照度(E)计算作为示例。已知半球所有的方向集合为 \Omega,法向量为 n 的点 p 处的入射辐射照度为:

\displaystyle E(p,n)=\int_\Omega L_i(p,\omega)\vert cos\theta\vert\,d\omega

  其中, L_i(p,\omega) 表示为入射辐射亮度函数,\theta 表示为 \omega 和表面法线 n 之间的夹角,辐射亮度 L 不论是入射还是出射,方向均指向半球外。如下图所示:
Lip 处的辐射照度(E)表示为:在该点上方的半球体上,辐射量度乘以入射方向余弦值的积分

球体坐标积分运算

  在渲染中,经常需要将立体角积分转换为球体坐标 (\theta,\phi) 积分。已知,(x,y,z) 可以根据球面角来表示表示,由下图所示:

\left\{ \begin{array}{c} x=&sin\theta\,cos\phi \\ y=&sin\theta\,sin\phi \\ z=&cos\theta \end{array} \right.
球面角转换
若给定 x,y,z 基向量,方向向量可根据球体坐标 (\theta,\phi) 表示。球面角公式可方便在两种表达方式之间予以转换。

  那么如何确定方向角的转换呢?由极限定理知道 r*d\theta=弧长,所以微分面积 d\omega 表示为微分边长 sin\theta d\phid\theta 间的乘积,有d\omega=sin\theta d\theta d\phi
球面角微分微分立体角构成的微分面积 dA 表示为两条边的微分长度 sin\theta d\phid\theta 之间的乘积。
最终结果 d\omega=sin\theta d\theta d\phi 为立体角积分和球面角积分转换间的核心内容。

  所以半球入射辐射照度又可记为如下形式

\displaystyle E(p,n)=\int^{2\pi}_0\int^{\pi/2}_0L_i(p,\theta,\phi)cos\theta sin\theta\,d\theta d\phi

  如果源自各方向的辐射度均等,则上式简化为 E=\pi L_i

面积积分运算

  最后一个用于简化计算的积分转换是将方向积分转换为面积积分。比较难,主要用于解区域光源对某一点贡献的辐射照度。
  假设四边形包含恒定的出射辐射照度,并计算 p 点处的最终入射辐射照度。如果在这里直接进行方向积分缺乏直观性——判断某区域是否在特定方向可见比较麻烦;而使用面积积分进行计算则相对简单。
  微分面积与微分立体角有如下关联:

\displaystyle d\omega={dAcos\theta\over r^2}
  其中,\theta 表示为 dA 的表面法线和 p 向量之间的夹角,r 表示为 pdA 之间的距离。此处并不打算对计算结果进行推导,面积在角方向上以 r^2 递增,且有一定偏向角,故而需要乘上 cos\theta 来表示投影到单位半圆上的方位角微分。
立体角积分转换面积积分微分面积 dA 形成的微分立体角等于 dAcos\theta/r^2

  因此,对于区域光源,入射辐射照度积分如下所示
\displaystyle E(p,n)=\int_AL_icos\theta_i{cos\theta_odA\over r^2}

  其中,L_i 表示此区域表面的发射辐射亮度,\theta_i 表示点 p 处表面法线与光线上 p-p’ 方向之间的夹角,\theta_o 表示光线上点 p’ 处表面法线与 p’-p 方向之间的夹角,如下图所示。
四边形光源计算辐射照度  当采用区域光源计算点 p 处的辐射照度,与不规则方向集的积分相比,可方便地采用表面积积分进行计算。


本文参考:
[1] PBRT
[2] Irradiance和Radiance的区别
[3] 理解radiance irradiance

About the Author

说点什么

avatar