http://69.163.227.177/forum.php?mod=viewthread&tid=4563
5.2 辐射度学基础
辐射度学提供了描述光的传播和反射的基本理论和数学工具。它也是本书所用到的渲染算法的基础。有趣的是,辐射度学并不起源于物理光学的基本原理,而是建立在关于光在空间中做粒子性传播的一种抽象之上。所以,诸如光的偏振等现象就不在此理论框架的讨论范围之内。然而,辐射度学和麦克斯韦方程有相应的联系,使得辐射度学也具备了很坚实的物理基础。
辐射传输(Radiative transfer)理论是对辐射能传输的现象学研究。它是基于辐射度学中的原理并且是操作在几何光学的层面上的,在该层面上,光的宏观性质足以用来描述光跟远大于光波长的物体的交互作用。虽然它也常常涉及到光的波动理论模型所描述的现象,但是这些结果需要用辐射传输理论的语言来描述。利用这种方式,我们就可以描述光跟尺寸接近于光波长的物体之间的交互作用,从而能够描述诸如光的色散和干涉现象。更近一步地,描述光和原子的交互作用就要用到量子力学。幸运地是,解决计算机图形学中的渲染问题还没有必要劳驾量子力学。
在pbrt中,我们假定用来描述光和光散射的几何光学模型已经足够用了。这就需要我们有下面几个关于光的行为的基本假设:
· 线性:两个对光学系统的输入所产生的合成效果总是等于两个单独的输入的效果之和。
· 能量守恒:当光从表面或参与介质上产生散射现象时,这些散射现象不会产生更多的能量。
· 无偏振现象:我们忽略电磁场的偏振现象,因此,光的性质只跟波长的分布(或频率)有关。
· 无荧光或磷光现象:光在某一波长上的行为完全独立于在另一个波长上的行为。跟偏振现象一样,加上这些效果并不难,但是对整个系统的实际意义不大。
· 稳定态:我们假定环境中的光已经达到平衡状态,所以它的辐射分布不会随时间的变化而变化。实际场景中的光也几乎是如此的,故不能算成一个实际限制。注意磷光现象就违背了这条假定。
采用几何光学模型的最大缺失是很难解释光的衍射现象和干涉现象。就象Preisendorfor(1965)所说的,这是一个难题,例如,在出现光的衍射或干涉的情况下,两个面积上的总辐射通量并不一定等于两个单独面积上的辐射通量之和。
5.2.1 基本量
在渲染算法中要用到四个非常重要的辐射量值定义:辐射通量(flux),辐射照度(irradiance),辐射强度(intensity),和辐射亮度(radiance)。所有这些量是跟波长相关的。本章将不再强调这个相关性,但是记住这一点很重要。
辐射通量
辐射通量(Radiant flux),又称功率(power),是单位时间内穿过一个表面或一个空间区域的总能量。单位是焦耳/秒(J/s),或是更常用的单位瓦特(W), 通常用符号Φ表示。光源的发射总量通常用辐射通量表示。图中的点光源的辐射通量可以用穿过一个包围着光源的、想象中的球面的总能量来表示。注意图中有两个想象球面,穿过这两个球面的通量是相同的—虽然就球面上的局部而言穿过大球上的能量要少于穿过小球上的能量,但总体上的通量是相同的。
辐射照度
辐射照度(Irradiance, E)是辐射通量的面积密度(W/m2)。对于上图的点光源的例子而言,在大球面上的辐射照度要小于小球面上的辐射照度,因为前者的表面积要大于后者的表面积。特别地,如果球面半径是r, 则有:
E = Φ / 4πr2
这个事实就解释了为什么来自光源的能量是随着跟光源的距离的平方而衰减的。
辐射照度方程也有助于理解朗伯(余弦)定律(Lambert’s law),即:到达一个表面上的光的能量跟光线方向和表面法向量的夹角余弦成比例。假定有一个面积为A且辐射通量为Φ的光源照射到一个表面上(如图)。如果光源直射到表面上(图左),那么能接受到照射的表面面积A1就等于A,在A1中每点上的辐射照度就是:
E1 = Φ / A
然而,如果光源方向跟表面有一个夹角(图右),那么能接受到照射的表面面积就要大一些。如果A比较小,那么所接受到辐射通量的面积A2就大约为A/cosθ。对于A2的点而言,其辐射照度就是:
E2 = Φ cosθ / A
为了覆盖更一般的情况,即当辐射通量的分布并非恒定时,某一点上的辐射照度有下面更正式的定义:
E = d Φ / dA
其中,分子是微分通量,分母是微分面积。
立体角和辐射强度
为了定义辐射强度(Intensity),我们先要定义立体角(solid angle)。立体角实际上是平面角的概念在球面上的延伸。(如图)平面角(planar angle)是对于某个位置而言能够涵盖住某个物体的总角度。例如,考虑一个以位置P为中心的单位圆,如果我们把打着阴影的物体投影到圆周上,圆周上就有一段被投影覆盖的圆弧s。圆弧s的长度(等同于角度θ)就是能够涵盖住物体的夹角。平面角的测量单位是弧度。
对于立体角,我们把2D的单位圆延伸为3D单位球面。总面积s就是能够涵盖住物体的立体角。立体角的测量单位是球面度(steradians)。整个球面的立体角是4π,半球面的立体角是2 π。
单位球上的点可以用来表示以球心为起始点的向量。我们用符号ω来表示这些正规化了的向量。
有了上面的定义以后,就可以定义辐射强度(Intensity)了,即是单位立体角的辐射密度。
I = d Φ / dω
辐射强度描述了光源的方向性分布,但只对点光源才有意义。
辐射亮度(Radiance)
现在介绍最后一个也是最重要的辐射度学中的量值,辐射亮度,L。辐射亮度是单位面积单位立体角的辐射通量密度,即:
L = d Φ / dω dAproj
其中dAproj是面积dA在垂直于ω的假想表面上的投影面积(如图)。因此,它是当入射光方向上相关的dω趋向极小且表面上相关的局部面积dA趋向极小时测量入射光在表面上的极限值。
在所介绍的这些辐射量定义中,辐射亮度是本书最常用的。其中一个直接的原因是因为它是最基本的辐射量;只要给定辐射亮度,所有其它的量都可以通过求面积和方向上的积分而得到。辐射亮度的另一个良好的性质是它通过空的空间区域时保持不变。这对光线追踪的计算非常便利。
5.2.2 入射光和出射光的辐射亮度函数
当我们讨论某个环境中某个点上的辐射亮度并写关于辐射亮度的方程时,有必要区别开到达某个点上的辐射亮度(例如,光源所引起的照明)和离开那个点的辐射亮度(例如,表面上的反射)。在pbrt中,我们用入射光和出射光的辐射亮度函数来区别这两种情况。
我们考虑物体上的一个点P。到达该点上的入射光的辐射亮度分布可以用一个关于位置和方向的函数来描述,我们记之为Li(P, ω)。我们把出射光的辐射亮度的函数记为Lo(P, ω)。注意在这两种情况下ω的方向是背离点P的,有些作者使用使用另一种记法使得两个函数中的ω正好相反(Li中的ω方向指向P)。
应该注意,通常情况下,Li(P, ω)不等于Lo(P, ω)。
另一个需要记住的性质是,在没有表面也没有引起散射的参与介质的空间中,对于点P有下列关系:
Lo(P, ω) = Li(P, -ω)。
5.3 使用辐射度积分
在渲染过程中最常见的任务之一就是求辐射度积分。在本节中,我们要介绍一些简化这一任务的技巧。为了讲明白这些技术,我们以计算某点上的辐射照度值为例。设在点P上的法向量为n,在方向集合Ω上的辐射亮度所引起的在该点的辐射照度是:
其中Li(P, ω) 是入射光的辐射亮度函数,积分中的cosθ项来自辐射亮度定义中的dAproj项。θ是方向ω和法向量n的夹角。我们通常对给定法向量n所对应的半球面的方向集合求积分来计算出辐射照度(如图)。
5.3.1 投影立体角(projected solid angle)上的积分
积分式中的余弦项是可变项,不利于积分的意义的表达。为了避免这个问题,我们可以用立体投射角(而不是立体角)来测量积分所对应的面积。跟立体角一样,能涵盖物体的投影立体角是由物体到单位球面上的投影来决定的,但是还要近一步地把投影结果再在投影到单位圆盘上(如图)。因此,可以等价地把对半球上的方向积分写成对投影立体角的积分。
投影立体角测度跟立体角测度的关系如下:
因此,由辐射亮度求半球上的辐射照度的积分的公式可以简化为:
5.3.2 球面坐标上的积分
为了方便起见,我们常常把立体角上的积分转换为球面坐标(θ,Φ)上的积分。回顾一下方向向量(x,y,z)和球面参数角的关系如下:
x = sin θ cos Φ
y = sin θ sin Φ
z = cos θ
为了把立体角上的积分转换为球面坐标(θ,Φ)上的积分,我们需要表达方向集dω的微分面积跟(θ,Φ)坐标对的微分面积的关系(如图)。dω的微分面积等于它的微分边长sinθ dΦ和dθ的乘积。因此:
dω = sin θ dθ dΦ
这样我们可以把半球上的辐射照度的积分公式改写为:
如果在所有方向上的辐射亮度相同,那么上式就简化为 E = π Li。
跟利用入射光的辐射亮度求辐射照度的方法类似,我们也可以计算物体表面积A上的围绕法向量的半球面的总辐射通量:
为方便起见,我们定义两个把θ和 Φ转换为(x,y,z)方向向量的函数。第一个函数实现了前面所给出的公式。注意函数的参数是θ的sine和cosine值(而不是θ本身)。这是因为调用者通常已经有了这两个三角函数值。而对Φ而言却不是如此,所以要直接传入Φ值。
<Geometry Inline Functions> +=
inline Vector SphericalDirection(float sintheta, float costheta, float phi) {
return Vector(sintheta * cosf(phi),
sintheta * sinf(phi),
costheta);
}
第二个函数利用所传入的代表x,y,z轴的基向量, 返回在这三个轴对应的坐标系下的方向向量。
<Geometry Inline Functions> +=
inline Vector SphericalDirection(float sintheta, float costheta, float phi,
const Vector &x, const Vector &y,
const Vector &z) {
return sintheta * cosf(phi) * x +
sintheta * sinf(phi) * y + costheta * z;
}
由方向(x,y,z)求两个球面参数角的公式为:
θ = arccos z
Φ = arctan ( y / x)
相应的函数实现如下,其中所传入的向量v已经被正规化了:
<Geometry Inline Functions> +=
inline float SphericalTheta(const Vector &v) {
return acosf(v.z);
}
<Geometry Inline Functions> +=
inline float SphericalPhi(const Vector &v) {
float p = atan2f(v.y, v.x);
return (p < 0.f) ? p + 2.f * M_PI : p;
}
5.3.3 面积上的积分
另一个能够简化计算的转换积分方法是把对方向的积分转换为对面积的积分。考虑本节开始介绍的辐射照度积分公式,假设有一个具有恒定光辐射的四边形,我们需要计算在点P上的辐射照度。用方向上的积分计算这个值并不容易,因为给定一个方向,我们难以确定这个四边形在这个方向上是否可见。但是,在四边形的面积上求辐射照度积分就容易多了。
微分面积跟微分立体角(从点P的方向来看)的关系如下:
dω = (dA cos θ) / r2
其中,θ是dA的法向量跟P到dA的向量的夹角, r是P到dA的距离。我们不在这里推导这个公式了,我们可以对它有直观上的理解:如果dA跟P的距离为1,并跟方向dω正好垂直,则dω = dA, θ = 0, 显然上式成立。如果dA远离开P,或者把四边形倾斜使它不再跟dω垂直,r2和cos θ都可以使dω减小。
因此,我们把四边形光源的辐射照度积分公式写为:
其中L是四边形的表面所发射出的辐射亮度,θi是在点P的法向量跟P到光源上P'的方向向量的夹角。θo是p'在光源上的法向量跟P'到P的方向向量的夹角。
5.4 表面反射和BRDF
当光线入射到表面上,表面就会对光产生散射,把其中一部分光反射回环境中。对这种反射,我们要描述两个主要的效果:反射光的光谱分布(spectral distrbution)和它的方向分布(directional distribution)。例如,柠檬皮吸收了绝大部分的蓝光波段的光,而反射了红光波段和绿光波段的光。因此,当用白光照射它时,它的颜色呈黄色。不管从那个方向观察柠檬皮,它基本上保持同一颜色,虽然有些方向上可以看到高光(白色多于黄色的区域)。相反地,一面镜子所反射出的光几乎完全依赖于观察方向。对于镜子上的一个固定的点,当观察角度改变时,镜子所反射的物体也跟着改变。
双向反射分布函数(bidirectional reflectance distribution function, BRDF)是一个正规地表述这类反射的核心概念。如图,给定方向ωi上的入射光辐射亮度Li(p, ωi),我们想知道在朝向观察者的方向ωo上有多少的辐射亮度离开表面,即Lo(p, ωo)。
如果我们把方向ωi看作关于方向的微分圆锥(a differential cone of directions),那么在P点的微分辐射照度是:
dE(p, ωi) = Li(p, ωi) cos θi dωi
因这个辐射照度而产生的ωo方向上的微分辐射亮度dLo(p, ωo)跟微分辐射照度dE(p, ωi)成正比例, 这个比例常数就定义了表面的关于给定方向对(ωi, ωo)的BRDF:
fr(p, ωi, ωo) = dLo(p, ωo) / dE(p, ωi) = dLo(p, ωo) / Li(p, ωi) cos θi dωi
基于物理的BRDF有如下两个性质:
1. 互逆性: 对于所有的方向对(ωi, ωo), 有fr(p, ωi, ωo) = fr(p, ωo, ωi) 。
2. 能量守恒: 反射光的所有能量小于或等于入射光的能量。
表面的双向透射分布函数(BTDF)表述透射光的分布,它的定义跟BRDF类似,记为ft(p, ωi, ωo)。有趣的是,BTDF并不遵守互逆性原则。(见第9.2节)。
为了方便,我们把BRDF和BTDF统一记为f(p, ωi, ωo);并称之为双向散射分布函数(bidirectional scattering distribution function, BSDF)。 利用BSDF的定义,我们有:
dLo(p, ωo) = f (p, ωi, ωo) Li(p, ωi) |cos θi| dωi
这里把cos θi加上取绝对值符号,这是因为pbrt并不把法向量改为反方向使其跟ωi在表面的同一侧。因为我们保证法向量总是指向表面的外面,取绝对值是为了保证计算的正确性。
我们对上式取围绕点P的入射方向球面上的积分,在方向ωo上的散射出的辐射亮度为:
这就是基本的渲染方程。它基于表面的散射性质,描述了在某一点上的入射光分布如何被转换为光的散射分布。当对整个球面进行积分时,称之为散射方程。当对半球面进行积分时,称之为反射方程。第16章所介绍的积分例程的核心任务之一求这个场景中表面上的点的积分。