这个系列是Physically Based Rendering: From Theory To Implementation的读书笔记,本节主要介绍辐射度量学的相关内容。
Spectral Representation
我们知道光的物理本质是电磁波,因此想要严格地描述光线的行为需要考虑光在不同波长上的能量分布,称为谱功率分布(spectral power distribution, SPD)。可见光的波长在400~700 nm,因此在图形学中我们主要关注这个范围内的SPD。
XYZ Color
对于人眼来说,视网膜上的三种细胞对于不同波长的光线有不同的响应,光线在人眼中的响应值可以使用SPD与匹配函数的积分来表示:
\[x_\lambda = \int_\lambda S(\lambda) X(\lambda) d \lambda\] \[y_\lambda = \int_\lambda S(\lambda) Y(\lambda) d \lambda\] \[z_\lambda = \int_\lambda S(\lambda) Z(\lambda) d \lambda\]其中,$x_\lambda$ $y_\lambda$ $z_\lambda$ 分别表示三种细胞的响应值;$S(\lambda)$为光线的SPD;$X(\lambda)$ $Y(\lambda)$ $Z(\lambda)$ 则是三种细胞的响应曲线。CIE规定的标准匹配函数曲线如下图所示:
因此人的视神经系统实际上是通过XYZ值来描述不同颜色的光线。基于同样的原因,绝大多数的颜色空间都是使用一个三维向量来描述不同的颜色。
RGB Color
对于显示设备来说,不同的颜色可以通过红绿蓝三种标准颜色的光线进行组合来获得。LCD和LED三种颜色的SPD如下图所示:
显然,同样的RGB颜色在不同的显示设备中会有不同的SPD。RGB为(0.6, 0.3, 0.2)的颜色在LCD和LED设备上的SPD可以参见下图:
对于给定的SPD,我们可以用$x_\lambda$ $y_\lambda$ $z_\lambda$来表示并转换成RGB颜色。以红光的分量为例:
\[\begin{aligned} r &= \int R(\lambda) S(\lambda) d \lambda \\ &= \int R(\lambda) (x_\lambda X(\lambda) + y_\lambda Y(\lambda) + z_\lambda Z(\lambda)) d \lambda \\ &= x_\lambda \int R(\lambda) X(\lambda) d \lambda + y_\lambda \int R(\lambda) Y(\lambda) d \lambda + z_\lambda \int R(\lambda) Z(\lambda) d \lambda \end{aligned}\]写成矩阵的形式为:
\[\begin{bmatrix} r \\ g \\ b \end{bmatrix} = \begin{bmatrix} \int R(\lambda) X(\lambda) d \lambda & \int R(\lambda) Y(\lambda) d \lambda & \int R(\lambda) Z(\lambda) d \lambda \\ \int G(\lambda) X(\lambda) d \lambda & \int G(\lambda) Y(\lambda) d \lambda & \int G(\lambda) Z(\lambda) d \lambda \\ \int B(\lambda) X(\lambda) d \lambda & \int B(\lambda) Y(\lambda) d \lambda & \int B(\lambda) Z(\lambda) d \lambda \\ \end{bmatrix} \begin{bmatrix} x_\lambda \\ y_\lambda \\ z_\lambda \end{bmatrix}\]Radiometry
辐射度量学(radiometry)是利用数学工具来研究电磁辐射强弱的学科。在图形学中我们利用辐射度量学来精确描述光线如何进行传播和反射,同时我们还忽略了光的波动性质从而简化计算。PBRT基于几何光学对光线的性质进行了如下假设:
- 线性(linearity):两个光学系统共同作用的效果等于它们分别作用的和
- 能量守恒(energy conservation):当光线发生散射时不会带来新的能量
- 没有极性(no polarization):不考虑电磁场的极性,只考虑光线在不同波长上的分布
- 没有荧光/磷光(no fluorescence or phosphorescence):不同波长之间相互独立
- 稳态(steady state):环境中的光场已经达到了平衡
Basic Quantities
接下来介绍辐射度量学中常用的各种物理量。
Energy
最基本的物理量是能量(energy),它的单位是焦耳(J),用$Q$来表示。波长为$\lambda$的光子(photon)具有的能量为:
\[Q = \frac{h c}{\lambda}\]其中$c$为光速,而$h$为普朗克常数。
Flux
接下来定义单位时间内接收到的能量为flux或power,用$\Phi$来表示:
\[\Phi = \lim_{\Delta t \to 0} \frac{\Delta Q}{\Delta t} = \frac{d Q}{d t}\]flux的单位是瓦特(W)。我们对flux进行积分就可以得到能量:
\[Q = \int_{t_1}^{t_2} \Phi(t) \ dt\]Irradiance
单位面积上接收到的flux称为irradiance,它的单位是W/m2:
\[E = \frac{\Phi}{A}\]对于点光源,在光线传播过程中不同半径上的球面上irradiance为:
\[E = \frac{\Phi}{4 \pi r^2}\]我们同样可以对irradiance积分来获得flux:
\[\Phi = \int_A E(p) \ d A\]关于irradiance还需要注意的一点是它与光线入射的角度相关。如果光线垂直入射则可以直接使用前面的公式计算:
\[E_1 = \frac{\Phi}{A_1}\]如果光线的方向与平面法向存在夹角则需要将$\Phi$投影到法向上:
\[E_2 = \frac{\Phi \cos{\theta}}{A_2}\]Solid Angle and Intensity
在更进一步的讨论前我们还需要引入立体角(solid angle)的概念。立体角是平面角度在球面上的推广,它定义为球面上面积除以球面半径的平方,同时也等于物体投影到单位球面后投影区域的面积:
\[\Omega = \frac{A}{r^2}\]显然整个球面的立体角为$4 \pi$ sr,半球面的立体角为$2 \pi$ sr。
对于点光源我们定义在单位立体角上单位时间内发射的能量为:
\[I = \frac{\Phi}{4 \pi}\]$I$称为intensity(W/sr)。同样地,我们可以对立体角进行积分来获得功率:
\[\Phi = \int_\Omega I(\omega) \ d \omega\]Radiance
接下来我们介绍辐射度量学中最重要的物理量radiance,记为$L$。radiance表示在$\omega$方向上的单位立体角和垂直此方向的单位面积上的flux:
\[L = \frac{\Phi}{d \omega \ d A^\perp}\]radiance是辐射度量学中最基本的物理量,前面介绍的其它物理量都可以通过radiance来导出。radiance既可以表示出射光线,也可以表示入射光线,同时根据能量守恒在真空中radiance保持不变。因此在光线追踪算法中我们实际上计算的是光线的radiance。
Incident and Exitant Radiance Functions
为了计算光线和物体表面的相互作用,我们还需要区分物体表面的正向和负向。两个方向上的radiance可以定义为:
\[L^+ (p, \omega) = \lim_{t \to 0^+} L(p+t \cdot n_p, \omega)\] \[L^- (p, \omega) = \lim_{t \to 0^-} L(p+t \cdot n_p, \omega)\]其中$n_p$为$p$点处的法向。同时我们定义在$p$点上入射的radiance为$L_i (p, \omega)$,出射的radiance为$L_o (p, \omega)$。把二者结合起来就得到了入射光和出射光的形式:
\[L_i (p, \omega) = \left\{ \begin{aligned} & L^+ (p, -\omega), & & \omega \cdot n_p > 0 \\ & L^- (p, -\omega), & & \omega \cdot n_p < 0 \end{aligned} \right.\] \[L_o (p, \omega) = \left\{ \begin{aligned} & L^+ (p, \omega), & & \omega \cdot n_p > 0 \\ & L^- (p, \omega), & & \omega \cdot n_p < 0 \end{aligned} \right.\]Radiometric Integrals
在渲染中我们经常需要计算radiance的积分,比如说$p$点的irradiance可以表示为各个方向上入射radiance的积分:
\[E (p, n) = \int_\Omega L_i (p, \omega) \vert \cos{\theta} \vert \ d \omega\]Integrals over Projected Solid Angle
我们可以把$\vert \cos{\theta} \vert \ d \omega$看作投影后的立体角:
\[d \omega^{\perp} = \vert \cos{\theta} \vert \ d \omega\]这样irradiance可以理解为投影立体角上的积分:
\[E (p, n) = \int_\Omega L_i (p, \omega) \ d \omega^{\perp}\]Integrals over Spherical Coordinates
在实际计算中我们会大量使用球坐标,因此我们还需要推导球坐标下的积分形式。在球坐标中使用两个角度$(\theta, \phi)$来表示方向,球面上的点$(x, y, z)$和$(\theta, \phi)$的转换关系为:
\[x = \sin \theta \ \cos \phi\] \[y = \sin \theta \ \sin \phi\] \[z = \cos \theta\]微分立体角在球坐标下的表达式为:
\[d \omega = \sin \theta \ d \theta \ d \phi\]这样我们可以把radiance的积分写成球坐标积分的形式:
\[E (p, n) = \int_0^{2 \pi} \int_0^{\frac{\pi}{2}} L_i(p, \theta, \phi) \cos \theta \ \sin \theta \ d \theta \ d \phi\]Integrals over Area
在很多情况下我们还需要计算radiance在面积上的积分。根据几何关系,面积微元和微分立体角的转换关系为:
\[d \omega = \frac{d A \ \cos \theta}{r^2}\]其中$\theta$为$d A$法向与入射方向的夹角,$r$为$d A$与$p$点之间的距离。
把上式带入到irradiance积分就得到了radiance在面积上积分的表达式:
\[E (p, n) = \int_A L \cos \theta_i \frac{\cos \theta_o \ d A}{r^2}\]其中$\theta_i$为微分立体角与$p$点法向的夹角,而$\theta_o$为微分立体角与$dA$的夹角。
Surface Reflection
当光线入射到物体表面上时会发生散射,其中一部分会被吸收而另一部分则会反射到环境中。因此要描述光线的反射行为我们需要两种信息:一是光线在光谱上的分布,而是光线在不同反射方向上的分布。对于透光的材质,它们的反射行为要更复杂一些:此时光线从某个点射入后会进入到材质中,经过一段运动并从另一个点射出。在PBRT中使用了BRDF以及BSSRDF来描述不同材质的反射行为。
BRDF
双向反射分布函数(bidirectional reflectance distribution function, BRDF)是描述光线反射的基本方法,它定义为同一束光线在出射方向$\omega_o$上radiance与入射方向$\omega_i$上irradiance的比值:
\[f_r (p, \omega_o, \omega_i) = \frac{d \ L_o (p, \omega_o)}{d \ E(p, \omega_i)} = \frac{d \ L_o (p, \omega_o)}{L_i(p, \omega_i) \cos{\theta_i} \ d \omega_i}\]基于物理的BRDF需要满足以下两个性质:
- 对称性(reciprocity):交换$\omega_i$和$\omega_o$BRDF保持不变,\(f_r (p, \omega_o, \omega_i) = f_r (p, \omega_i, \omega_o)\)
- 能量守恒(energy conservation):出射能量一定小于等于入射能量,\(\int_{H^2(n)} f_r (p, \omega_o, \omega') \cos{\theta'} d \omega' \leq 1\)
对于透射的情况需要使用BTDF(bidirectional transmittance distribution function)来代替BRDF进行计算,不过需要注意的是此时出射方向$\omega_o$与入射方向$\omega_i$分别为位于正负两个半球上。
我们把BRDF和BTDF统一到一起就得到了BSDF(bidirectional scattering distribution function)。入射和出射方向上的radiance可以通过BSDF联系起来:
\[d L_o(p, \omega_o) = f (p, \omega_o, \omega_i) L_i(p, \omega_i) \vert \cos{\theta_i} \vert \ d \omega_i\]在整个球面上进行积分就可以得到出射方向完整的radiance:
\[L_o(p, \omega_o) = \int_{S^2} f (p, \omega_o, \omega_i) L_i(p, \omega_i) \vert \cos{\theta_i} \vert \ d \omega_i\]上式是整个渲染过程最重要的方程之一,称为散射方程(scattering equation)。如果把积分域仅定义在上半球上,则上式也称为反射方程(reflection equation)。
BSSRDF
双向次表面散射分布函数(bidirectional scattering surface reflectance distribution function, BSSRDF)用来描述光线在次表面上的运输,类似于BRDF它定义为同一束光线在出射点$p_o$方向$\omega_o$上的radiance与入射点$p_i$方向$\omega_i$上flux的比值:
\[S(p_o, \omega_o, p_i, \omega_i) = \frac{d L_o (p_o, \omega_o)}{d \Phi(p_i, \omega_i)}\]要计算出射方向上完整的radiance则需要对入射方向和物体表面进行积分:
\[L_o (p_o, \omega_o) = \int_A \int_{H^2(n)} S(p_o, \omega_o, p_i, \omega_i) L_i(p, \omega_i) \vert \cos{\theta_i} \vert \ d \omega_i \ dA\]