光照模型和 BRDF
paperreading
本文字数:4.2k 字 | 阅读时长 ≈ 15 min

光照模型和 BRDF

paperreading
本文字数:4.2k 字 | 阅读时长 ≈ 15 min

本文参考了本篇博客,同时加入了 Phong 光照模型

一、预备知识

在介绍光照模型和 BRDF(双向反射分布函数)时,我们要先理解一些基本概念,这些概念与辐射度学有关

1. 能量

每个光子都具有一定的能量(Energy),能量大小与频率有关$E = hv$。用符号$Q$表示,单位是焦耳$J$

2. 功率

==功率、辐射通量、通量==

功率(Power),也被称为辐射通量(Radiant Flux)或者通量(Flux),指的是单位时间内通过表面或者空间区域的能量的总量。用符号$\Phi$表示,$\Phi = \frac{dQ}{dt}$,单位为瓦特$W$,或者焦耳/秒$J/S$

3. 辐照度和辐出度

==辐照度(辐射通量密度)==

==辐出度、辐射出射度、辐射度(辐射通量密度)==

注意辐射通量和辐射通量密度之间的区别

如下图所示

一束平行光之间的间距为$d$,一个垂直入射,一个与表面法线成$\theta_{i}$的角度入射,观察表面的间距,其中左图间距为$d$,右图为$\frac{d}{cos\theta_{i}}$,相对于左图,右图的间距增大了。由于辐射通量是单位时间内通过表面或空间区域内的能量总和,所以辐射通量相同;而辐射通量密度是单位时间内通过单位面积的能量,右边面积大,所以右边辐射通量密度变小

让我们来看一下二者辐射通量密度的差异:假设右图中不垂直于光线方向的表面面积为$A$,将他投影到垂直于直线方向得到一个虚拟表面,面积为$A^{\perp } = Acos\theta_{i}$,通过这两个面积的通量相同,设为$\Phi$,则表面接收到的辐射通量密度$E = \frac{\Phi}{A}$,虚拟表面的辐射通量密度$E_{\perp} = \frac{\Phi}{A^{\perp}} = \frac{\Phi}{Acos\theta_{i}}$,得到$E = E_{\perp}cos\theta_{i}$

同理对于点光源,假想以点光源为中心不同半径的求包围着点光源,穿过这些球的辐射通量是相通的,均为$\Phi$,球的表面积为$4\pi r^{2}$,得到辐射通量密度$E = \frac{\Phi}{4\pi r^{2}}$,即通量密度与距离的平方成反比,即光的衰减与距离的平方成反比

4. 辐射强度

==辐射强度==

立体角:度量三维角度的量,用符号$\omega$表示,立体角计算为$\omega = \frac{s}{r^{2}}$,单位球的表面积为$4\pi r^{2} = 4\pi$,所以球面的立体角也为$4\pi$

辐射强度(Radiant Intensity),通过单位立体角的辐射能量,用符号$I$表示,$I=\frac{d\Phi}{dw}$,单位$W/sr$

引入辐射强度的原因是:有时候需要度量通过一个点的通量的密度,因为点的面积是 0,无法直接使用辐射通量密度,所以引入辐射强度。辐射强度不会随距离的增大而衰减,这是因为立体角不会随距离的变化而变化

5. 辐射率

==辐射率==

辐射率(Radiance),每单位面积每单位立体角的辐射通量密度,用符号$L$表示,$L = \frac{d\Phi}{d\omega dA{\perp}}$,单位为$W/m{2}sr$,其中$dA^{\perp}$是微分面积$dA$在垂直于光线方向的投影,如图

辐射率可以看成我们眼睛看到(相机拍到)的物体上一点的颜色,基于物理着色时,计算表面一点的颜色就是计算它的辐射率,辐射率不会随距离变化而衰减,这和我们日常感受一致,在没有雾霾的干扰时,我们看到的物体表面上一点的颜色并不会随距离变化而变化。为什么辐照度会随距离增大而衰减,但是我们看到的颜色却不会衰减呢?这是因为随着距离变大,我们看到的物体上的一块区域到达视网膜的通量密度会变小,同时这块区域在视网膜表面上的立体角也会变小,正好抵消了通量密度的变化

二、BRDF

我们看到一个表面,实际上是周围环境的光照射到表面上,然后表面将一部分光反射到我们眼睛里。 双向反射分布函数 BRDF(Bidirectional Reflectance Distribution Function) 就是描述表面入射光和反射光关系的

对于一个方向的入射光,表面会将光反射到表面上半球的各个方向,不同方向反射的比例是不同的,我们用 BRDF 来表示指定方向的反射光和入射光的比例关系,BRDF 定义为:

$$
f(l, v) = \frac{dL_{o}(v)}{dE(l)}
$$

表面对不同频率的光反射率可能不一样,因此BRDF和光的频率有关。在图形学中,将BRDF表示为RGB向量,三个分量各有自己的$f$函数

BRDF需要处理表面上半球的各个方向,如下图使用球坐标系定义方向更加方便。球坐标系使用两个角度来确定一个方向:

所以BRDF也可以表示成$f(\theta_i, \phi_i, \theta_o, \phi_o)$。对于各向同性材质,当$l$和$v$同时绕法线$n$旋转时,$f$值保持不变,此时可以用$l$和$v$在平面投影的夹角$\phi$来代替$\phi _i$和$\phi _o: f(\theta_i, \theta_o, \phi)$

为什么BRDF要定义成辐射率和辐照度的比值,而不是直接定义为辐射率和辐射率比值,有两种解释

==第一种解释参考BRDF为什么要定义为一个单位是sr-1的量?==

结合下面辐射通量密度$(A)$和辐射率$(B)$测量仪的示意图来看:辐照度(辐射通量密度)测量仪$(A)$接受平面上半球的所有光线,可以测量一个较小面积来自于四面八方的所有光通量,光通量$\Phi$除以传感器面积$A$就可以得到辐照度(辐射通量密度)$E$。辐射度测量仪$(B)$则有一个长筒控制光线只能从一个很小的立体角进入测量仪,光通量$\Phi$除以传感器面积$A$和立体角$\omega$就可以得到辐射率$L$

测平面上一点在某一个方向的出射辐射率很简单,只需要用仪器$(B)$从该方向对准该点就可以了。而测平面一点入射的辐射率则没有那么简单,必须保证光源正好覆盖测量仪开口立体角,大了该点会接受到比测量值更多的光照,导致测量值比实际值小,小了则与仪器的设计立体角不一致,可在实际中是基本做不到光源大小正好覆盖测量仪开口立体角的。而测表面的辐照度则简单得多,只要保证光源很小,而且没有来自其他方向的光干扰,这时候测到的辐照度就是平面上来自光源方向的微分辐照度$dE$

==第二种解释从数学的角度出发==

对于现实世界中的非光学平面,一束光线射到表面上后,被表面反射到各个方向,其中一个出射方向的光通量只是整个反射光通量极小的一部分,当出射方向立体角趋于0时,$\lim_{\omega_{o} \rightarrow 0}{\frac{dL_{o} }{Li} } = 0$,所以在实际计算中使用辐射率和辐射率比值是没有意义的。而如果分母改成表面上接收到的来自光源方向的微分辐照度,我们知道$dE = L_i(l) d\omega _{i} cos \theta _{i}$,由于给入射辐射率乘了一个趋于零的微分立体角,$dE$的值会小很多,比值$\frac{dL_o}{dE}$是有意义的,而不是0

下面我们来看看怎么用BRDF来计算表面辐射率

我们考虑来自方向$l$的入射光辐射率$L_i(l)$,由辐射率和辐照度的定义:

$$
L_i(l) = \frac{d \Phi }{d\omega_i d A^{\bot } } = \frac{d \Phi }{d\omega_i dA cos \theta_i } = \frac{dE(l) }{d\omega_i cos \theta_i }
$$

则照射到表面来自于方向l的入射光贡献的微分辐照度:

$$
dE(l) = L_i(l) d\omega_i cos \theta_i
$$

表面反射到$v$方向的由来自于方向l的入射光贡献的微分辐射率:

$$
dL_o(v) = f(l, v) \otimes dE(l) = f(l, v) \otimes L_i(l) d\omega_i cos \theta_i
$$
符号$\otimes$表示按向量的分量相乘,因为$f$和$L_i$都包含RGB三个分量

要计算表面反射到v方向的来自上半球所有方向入射光线贡献的辐射率,可以将上式对半球所有方向的光线积分:

$$
L_o(v) = \int_{\Omega }^{} f(l, v) \otimes L_i(l) cos \theta_i d\omega_i
$$
上式称为反射方程(Reflectance Equation),用来计算表面反射辐射率

对于点光源、方向光等理想化的精准光源(Punctual Light),计算过程可以大大简化。我们考察单个精准光源照射表面,此时表面上的一点只会被来自一个方向的一条光线照射到(而面积光源照射表面时,表面上一点会被来自多个方向的多条光线照射到),则辐射率:

$$
L_o(v) = f(l, v) \otimes E_L cos \theta_i
$$
对于多个精准光源,只需简单累加就可以了:

$$
L_o(v) = \sum_{k = 1}^{n}{f(l_k, v) \otimes E_{L_k} cos \theta_{i_k}}
$$
这里使用光源的辐照度,对于阳光等全局方向光,可以认为整个场景的辐照度是一个常数,对于点光源,辐照度随距离的平方衰减,用公式$E_{L} = \frac{\Phi }{4\pi r^2}$就可以求出到达表面的辐照度,$\Phi$是光源的功率,比如100瓦的灯泡,r是表面离光源的距离

回头看看反射方程,是对表面上半球所有方向的入射光线积分,这里面包含了来自精准光源的光线,也包括周围环境反射的光线。处理来自周围环境的光线可以大幅提高光照的真实程度,在实时图形学中,这部分光照可以用基于图像的光照(Image Based Lighting)来模拟。我们将在下篇文章讨论基于图像的光照。

上面给出了BRDF的定义和使用BRDF计算表面反射辐射率的公式。但这个定义实际上是无法直接用于计算表面反射辐射率的,我们还要建立一个能模拟真实光照的模型,使得输入入射方向和出射方向,$f(l, v)$能输出表面反射微分辐射率和入射微分辐照度的比率。

1967年Torrance-Sparrow在Theory for Off-Specular Reflection From Roughened Surfaces中使用辐射度学和微表面理论建立了模拟真实光照的BRDF模型,1981年Cook-Torrance在A Reflectance Model for Computer Graphics中把这个模型引入到计算机图形学领域,现在这个模型已经成为基于物理着色的标准,被称为Cook-Torrance模型。下面我们来看看微表面理论和Cook-Torrance模型的推导过程。

三、Phong光照模型

光照到物体表面时,物体对光会发生反射、透射和吸收。简单光照模型只考虑物体对直接光照的反射作用,而物体间的光反射作用,只用环境光来表示。此时光源被假定为点光源,反射作用被细分为镜面反射和漫反射

==Phong光照模型==

根据Phong光照模型,物体被感知的亮度由环境光、漫反射光及镜面反射光组成,物体表面的反射光强度为
$$
I = K_{a}I_{a} + K_{d}I_{l}cos(\theta) + K_{s}I_{l}cos^{n}(\alpha)
$$

1. 漫反射

理想漫反射当光源来自一个方向时,漫反射光均匀向各方向传播,与视点无关,他是由表面的粗糙不平引起的,因而漫反射光的空间分布是均匀的。记入射光强为$I_{p}$,物体表面上点$P$的法向量为$N$,从点$P$指向光源的向量为$L$,当$L, N$为单位向量时,理想漫反射光强表示为:
$$
I_{d} = I_{p}K_{d}(L\cdot N)
$$

$K_{d}$:与物体有关的漫反射系数,取值$(0, 1)$。在RGB模型下,漫反射系数$K_{d}$有三个分量$K_{dr}, K_{dg}, K_{db}$分别表示RGB三原色的漫反射系数,反应物体颜色,通过调整三个分量可以改变物体的颜色,也可以吧入射光强$I$设为三个分量$I_{r}, I_{g}, I_{b}$通过调整这些分量来调整光源的颜色

2. 镜面反射

镜面反射光对于理想镜面,反射光集中在一个方向,并遵守反射定律。对一般光滑表面,反射光集中在一个范围内,且由反射定律决定的反射方向光强最大。因此对于同一点来说,从不同位置所观察到的镜面反射光强是不同的,镜面反射光强可以表示为:
$$
I_{s} = I_{p}K_{s}cos^{n}\alpha~~~\alpha \in (0, \frac{\pi}{2})
$$

镜面反射光将会在反射方向附近形成很亮的光斑,称为高光现象,将$V$和$R$看做单位向量,镜面反射光强可以重写为:
$$
I_{s} = I_{p}K_{s}(R\cdot V)^{n}
$$

其中$R = 2N(N\cdot L)-L$,镜面反射光产生的高光区域只反映光源的颜色,例如在红光照射下,一个物体的高光域是红光,镜面反射系数$K_{s}$是一个与物体颜色无关的参数,在简单光照明模型中,只能通过改变物体的漫反射系数来控制物体的颜色

3. 环境光

环境光指光源间接对物体的影响,是在物体和环境之间多次反射,最终达到平衡时的一种光,可以近似地认为同一环境下的环境光,其光强分布是均匀的,他在任何一个方向上的分布都相同,在简单光照模型中,用一个常数来模拟环境光,用式子表示为:
$$
I_{e} = I_{a}K_{a}
$$

4月 06, 2025
3月 10, 2025
12月 31, 2024