图形学中的辐射度
写在前面
光线追踪中最基础的部分是光线的传播和反射(一般把表面双向透射分布函数[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定律。到达表面的辐射照度随光照入射夹角的余弦值变化 对于面积为
A,通量为
\\Phi 的光源,如果垂直向下照射有
\\displaystyle E_1={\\Phi\\over A}如果光源和表面呈现一定角度,则接收光照的表面积将要增加为
A/cos\\theta,可以得到
\\displaystyle E_2={\\Phi cos\\theta\\over A} 立体角(solid angle)和光强
还记得刚开始出现的 d\\omega 吗?它表示立体角,可视为平面内二维角度值在球体角度的拓展,在单位球体上投影面积的大小,如下图所示
对象 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 不论是入射还是出射,方向均指向半球外。如下图所示:
点 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 处的辐射照度,与不规则方向集的积分相比,可方便地采用表面积积分进行计算。
本文参考:
[1] PBRT
[2] Irradiance和Radiance的区别
[3] 理解radiance irradiance