辐射度量学
1 辐射度量学
辐射度量学 (radiometry) 是研究光的辐射和传输过程的科学。它关注光的物理特性,如能量、亮度和颜色,并提供了一套用于描述和量化光的属性的数学工具和概念。
在计算机图形学中,辐射度量学着重讨论光的电磁横波中光学谱段的可见光谱的辐射能的计算。光学谱段范围值从波长 0.1 的红外线到 0.1nm 的 X 射线这一距离。可见光谱段指人眼产目视刺激从而形成光感和色感的谱段,范围大约为 0.38—0.76μm。
辐射度量学 (Radiometry) 是一种用来度量电磁场辐射(包括可见光)的手段。有很多种辐射度量 (radiometric quantities) 可以用来测量曲面或者某个方向上的光,此处只讨论和反射方程有关的一种量,它就是**辐射率 (Radiance)**,用 $L$ 来表示。
辐射度量学涉及的概念、名词、公式
名称 |
符号 | 单位 |
公式 | 解析 |
---|---|---|---|---|
辐射能量 Radiant Energy |
$Q$ | 焦耳 $J$ |
- | 电磁辐射能量 |
辐射通量 Radiant Flux |
$\Phi$ | 瓦 $W$ |
$\displaystyle\Phi=\frac{dQ}{dt}$ | 单位时间辐射的能量,也叫辐射功率 (Radiant Power)或通量 (Flux) |
辐照度 Irradiance |
$E$ | 瓦/平方米 $W/m^{2}$ |
$\displaystyle\Phi=\frac{d\Phi}{dA^{\perp}}$ | 到达单位面积的辐射通量 |
辐射度 Radiosity |
$M$ | 瓦/平方米 $W/m^2$ |
$\displaystyle M=\frac{d\Phi}{dA^\perp}$ | 离开单位面积的辐射通量,也叫辐出度、辐射出射度(Radiant Existance) |
辐射强度 Radiant Intensity |
$I$ | 瓦/立体弧度 $W/sr$ |
$\displaystyle I=\frac{d\Phi}{d\omega}$ | 在单位球面上,一个光源向每单位立体角所投送的辐射通量 |
辐射率 Radiance |
$L$ | 瓦/平方米立体弧度 $W/m^2sr$ |
$L=\displaystyle\frac{d\Phi}{d\omega dA^{\perp}}$ | 通过单位面积单位立体角的辐射通量。也叫辐射亮度 一个辐射强度为 $\Phi$ 的光通过立体角 $\omega$ 辐射在区域 $A$ 的可被观察到的总能量。 |
立体角 Solid Angle |
$\omega$ | 立体弧度,球面度 $sr$ |
$\displaystyle\omega=\frac{S}{r^{2}}$ | 投射到单位球体上的一个截面的大小或者面积。是二维弧度在三维的扩展,1 球面度等于单位球体的表面面积。 |
辐射率 $L$ 被用来量化单一方向上发射来的光线的大小或者强度。辐射率是由多个物理变量集合而成的,它涉及的物理变量有以下几种:
**辐射通量 (Radiant Flux)**:辐射通量用符号 $\Phi$ 表示,表示一个光源输出的能量,以瓦特为单位。光是由多种不同波长的能量集合而成,每种波长与一种特定的(可见的)颜色相关。因此一个光源所放射出来的能量可以被视作这个光源包含的所有各种波长的一个函数。波长介于 390nm(纳米)到 700nm 的光被认为是处于可见光光谱中,也就是说它们是人眼可见的波长。
上图展示了太阳光中不同波长的光所具有的能量。
传统物理学上的辐射通量将会计算这个由不同波长构成的函数的总面积,这种计算很复杂,耗费大量性能。在 PBR 技术中,不直接使用波长的强度,而是使用三原色编码(RGB)来简化辐射通量的计算。 虽然这种简化会带来一些信息上的损失,但是这对于视觉效果上的影响基本可以忽略。**立体角 (Solid Angle)**:用符号 $\omega$ 表示,它描述投射到单位球体上的一个截面的大小或者面积。可以把立体角想象成为一个带有体积的方向:
更加形象地描述:观察者站在单位球面的中心,向着投影的方向看,在单位球体面上的投影轮廓的大小就是立体角。辐射强度 (Radiant Intensity):用符号 $I$ 表示,它描述的是在单位球面上,一个光源向每单位立体角所投送的辐射通量。举个例子,假设一个点光源向所有方向均匀地辐射能量,辐射强度就能计算出它在一个单位面积(立体角)内的能量大小,即光源的能量照进立体角内的能量
计算辐射强度的公式:
$$I = \frac{d\Phi}{d\omega}$$ 其中 $I$ 表示辐射通量 $\Phi$ 除以立体角 $\omega$ 的辐射强度。
理解以上物理变量后,可以继续讨论辐射率方程了。下面方程代表的意义是:一个辐射强度为 $\Phi$ 的光通过立体角 $\omega$ 辐射在区域 $A$ 的可被观察到的总能量。
$$L=\frac{I}{dA^\perp}=\frac{\frac{d\Phi}{d\omega}}{dA\cos\theta}=\frac{d\Phi}{ dA d\omega \cos\theta}$$
笔者注:原文的公式是 $L = \frac{d^2\Phi}{ dA d\omega \cos\theta}$,经推导之后,并没有平方。
辐射率是一个区域内光照量的辐射学度量,按照光的入射(或者来源)角与平面法线的夹角 $\theta$ 计算 $\cos \theta$。越是斜着照射在平面上光越弱,反之越是垂直照射在表面上的光越强,类似基础光照中的漫反射颜色计算,$\cos \theta$ 直接等于光的方向和表面法线的点积。
1 | float cosTheta = dot(lightDir, N); |
[!quote]
上面的物理符号似乎和 PBR 的反射方程没有直接的关系。但是,如果将立体角 $\omega$ 跟区域 $A$ 都看作无限小,就可以使用辐射率来分析一束光线打在空间上一个点的通量,也就是说能够计算单束光线对单个(片元)点的辐射率影响。**进一步地,将立体角 $\omega$ 转化为方向向量 $\omega$,将区域 $A$ 转化成点 $p$**,因此在 shader 中直接使用辐射率来计算单束光线对每个片元的贡献。
实际上,当谈及光的辐射率时,通常只关注的是所有射入点 $p$ 的光线,这些光的辐射率总和称为**辐照度 (Irradiance)**。
2 详解辐射度量
立体角(Solid Angle)
在二维平面几何中,弧度(Radian,rad)是测量角度的标准单位,表示了与圆心角与其对应的圆弧长度的关系,见下图:
上图动态地描述了圆半径如何转化成圆弧,以及圆心角与弧度的对应关系。
可以明显看出,弧度只是衡量角度大小,跟半径无关,所以弧度的计算方式是圆弧的长度除以圆半径:
$$弧度 = 圆心角 = \frac{圆心角对应的弧长度}{圆半径}$$
如果对角度和弧长进行微分,就可用微分的方式表达($ds$表示微分的弧长):
$$d\theta = \frac{ds}{r}$$
同样地,在三维立体几何中,也有跟弧度类似的概念,用来衡量三维球体的圆心角,它就是立体角(宏观符号$\Omega$,微分符号$\omega$)。
立体角的定义,用公式表达就是:
$$立体角 = \frac{立体角对应的球表面面积}{半径的影响因子}$$
从上面可以看出,立体角与球体半径无关,由于是三维立体空间,且 **1 单位立体角的球表面面积为 $r^2$(上图),所以半径的影响因子就是 $r^2$**,用宏观符号公式表达:
$$\Omega = \frac {A}{r^{2} } sr$$
其中 $sr$(Steradian)是立体角的单位,叫立体弧度或球面度。
若对立体角和球表面面积微分,可得到微分形式的公式:
$$d\omega = \frac {dA}{r^{2}}$$
利用 Spherical Cap 的面积公式,可求得半个球体的立体角:
$$\Omega_{hemisphere} = \frac {2\pi r\cdot r}{r^{2} } sr = 2\pi \ sr$$
也就是说半个球体的立体角为 $2\pi \ sr$,整个球体的立体角为 $4\pi \ sr$:
$$\Omega_{sphere} = 4\pi \ sr$$
辐射强度(Radiant Intensity)**
辐射强度指通过单位立体角的辐射通量。用符号 $I$表示,单位 W$/sr$,微分公式:
$$I = \frac{d\Phi}{d\omega}$$
既然已有了辐照度和辐射度,为什么还要引入辐射强度呢?
原因是在计算辐射时,有时会考虑某个点的通量的密度,但一个点的面积是 0,无法用辐照度和辐射度的公式,故而引入跟面积无关的辐射强度。而辐射强度之所以跟面积无关,是因为立体角只跟角度相关,跟球体的半径、距离、面积无关。
也就是说,由于立体角不会随距离变化而变化,辐射强度不会随距离变化而变化,不像点光源的辐照度会随距离增大而衰减。
辐射率(Radiance)
辐射率是测量微小方向照到微小表面的通量,即每单位面积每单位立体角的辐射通量密度。用公式表达:
$$L = \frac{d\Phi}{d\omega dA^{\bot}}$$
辐射率实际上就是材质的颜色,在基于物理着色时,计算表面一点的颜色就是计算它的辐射率。
辐射率不会随距离变化而衰减,这和真实世界的物理原理一致:在没有空气干扰的情况下,我们看到的物体颜色并不会随距离变化而变化。
反照率 Albedo
[!NOTE] Title
$$Albedo=\frac{辐射度}{辐照度}=\frac{出射量}{入射量}$$
通过公式可以看出,反照率反映了材质吸收辐照通量(或反射辐照通量)的能力
一个粗糙的、无光泽的物体(如粉笔)表面对光的反射表现为漫反射(diffuse reflection),这样的表面对入射光在各个方向上呈强度相同的反射,因而无论从哪个角度观看,该点的亮度都是相同的。没有镜面反射,所以 $k_d = 1,\ k_s = 0$ 。然后漫反射的 $f_{lambert}$ 一项与 $p, \vec l, \vec v$ 参数无关,可以提到积分符号外面去,成了常数。方程就变成了
$L_o(p, \vec v) = f_{lambert} \cdot L_i(p, \vec l) \int _\Omega \cos\phi \ d\omega$ ,由于积分 $\int {\Omega} \cos \phi, d\omega = \pi$ (后面会给出推导过程),得到 $f{lambert} = \frac {albedo} {\pi}$ , $albedo = \frac {\sum L_o} {\sum L_i}$ 。这里出现了除以π。
这里科普一下几个术语。反照率(albedo)是行星物理学中用来表示天体反射本领的物理量,定义为物体的 辐射度(radiosity)与辐照度(irradiance)之比。射是出,照是入,出射量除以入射量,得到无量纲量。绝对黑体(black body)的反照率是 0。煤炭呈黑色,反照率接近 0,因为它吸收了投射到其表面上的几乎所有可见光。镜面将可见光几乎全部反射出去,其反照率接近 1。albedo 翻译成反照率,与 reflectance(反射率)是有区别的。反射率用来表示某一种波长的反射能量与入射能量之比;而反照率用来表示全波段的反射能量与入射能量之比。BRDF 的 R 是 reflectance,方程仅关注一种波长。
术语 albedo 与 diffuse 语义重叠,有时候会混用。当只存在漫反射,不存在镜面反射的情况下,albedo 才等于 diffuse (非金属下是漫反射颜色,金属是反射率)。其取值范围在 0(光全部吸收)到 1(光全部反射)之间,不同波长的光,其 reflectance 值不一样。由于不同波长的光能用 RGB 三原色表示,所以 albedo 也用 0 到 1 区间的 vec3 向量表示。场景中的物体不同表面处的 albedo 不一样,就要用上 albedo 纹理贴图了。
Albedo 纹理为每一个金属的纹素 (Texel)(纹理像素)指定表面颜色或者基础反射率。这和漫反射纹理相当类似,不同的是所有光照信息都是由一个纹理中提取的。漫反射纹理的图像当中常常包含一些细小的阴影或者深色的裂纹,而反照率纹理中是不会有这些东西的。它应该只包含表面的颜色(或者折射吸收系数)。——摘自《LearnOpenGL CN》