光线追踪中最基础的部分是光线的传播和反射(一般把表面双向透射分布函数[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}
而且,上式也表示了一个非常重要的现象:功率以平方距离衰减。
入射辐射照度和出射辐射照度也可以用通量相对面积的微分来表示:
E(p)=\lim_{\Delta A\to0}{\Delta \Phi(p)\over \Delta A}={d\Phi(p)\over dA}
即\displaystyle\Phi=\int_AE(p)\,dA
回忆一下 Lambertian 定律,为什么在光栅化渲染中,着色时总要乘一个余弦值?因为到达表面的光线数量正比于光线方向和表面法相夹角的余弦值,即光照强度不变的情况下,两者面积之比为余弦值,自然两者的功率(辐射照度)之比为余弦值的倒数。
还记得刚开始出现的 d\omega 吗?它表示立体角,可视为平面内二维角度值在球体角度的拓展,在单位球体上投影面积的大小,如下图所示
即
最后也是最重要的量值——辐射亮度(L),注意与辐射照度区分。辐射度表示单位面积单位立体角方向的功率,单位为 W/sr/m^2。请见如下定义:
这里使用 E_\omega 表示垂直于 \omega 的辐射量。辐射度常常用来表示特定方向的光照功率大小,一般用来模拟反射光线以及符合 delta 分布的光源比如点光源,聚光灯,方向光等等。立体角将功率、立体角、面积联系起来,非正对面积需要考虑余弦项,如下所示:
渲染中经常需要进行辐射量值的积分运算,有许多积分工具可以对此类计算进行简化。下面介绍三个渲染中比较重要的辐射照度积分的例子。
使用采样入射辐射照度(E)计算作为示例。已知半球所有的方向集合为 \Omega,法向量为 n 的点 p 处的入射辐射照度为:
在渲染中,经常需要将立体角积分转换为球体坐标 (\theta,\phi) 积分。已知,(x,y,z) 可以根据球面角来表示表示,由下图所示:\begin{array}{c}
x=&sin\theta\,cos\phi \
y=&sin\theta\,sin\phi \
z=&cos\theta
\end{array}
最后一个用于简化计算的积分转换是将方向积分转换为面积积分。比较难,主要用于解区域光源对某一点贡献的辐射照度。
假设四边形包含恒定的出射辐射照度,并计算 p 点处的最终入射辐射照度。如果在这里直接进行方向积分缺乏直观性——判断某区域是否在特定方向可见比较麻烦;而使用面积积分进行计算则相对简单。
微分面积与微分立体角有如下关联:d\omega={dAcos\theta\over r^2} 其中,\theta 表示为 dA 的表面法线和 p 向量之间的夹角,r 表示为 p 至 dA 之间的距离。此处并不打算对计算结果进行推导,面积在角方向上以 r^2 递增,且有一定偏向角,故而需要乘上 cos\theta 来表示投影到单位半圆上的方位角微分。
本文参考:
[1] PBRT
[2] Irradiance和Radiance的区别
[3] 理解radiance irradiance