光照模型和 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} \]

Sep 06, 2026
Aug 01, 2026