图形学中的辐射度


写在前面

  光线追踪中最基础的部分是光线的传播和反射(一般把表面双向透射分布函数[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$$ 不论是入射还是出射,方向均指向半球外。如下图所示:
Li点 $$p$$ 处的辐射照度(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\\phi$$ 和 $$d\\theta$$ 间的乘积,有$$d\\omega=sin\\theta d\\theta d\\phi$$。
球面角微分微分立体角构成的微分面积 $$dA$$ 表示为两条边的微分长度 $$sin\\theta d\\phi$$ 和 $$d\\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$$ 表示为 $$p$$ 至 $$dA$$ 之间的距离。此处并不打算对计算结果进行推导,面积在角方向上以 $$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$$ 处的辐射照度,与不规则方向集的积分相比,可方便地采用表面积积分进行计算。


转载请带上本文永久固定链接:http://www.gleam.graphics/radiance_in_graphics.html


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

About the Author

说点什么

您将是第一位评论人!

avatar