【cg】【pbr】基于物理的渲染理论篇

辐射度量学

辐射度量学是用来研究电磁辐射能量的科学。所以在这里,PBR使用辐射度量学的一些概念作为能量的表述单位,从而使得到的公式在能量方面得到定量的准确度。要想理清PBR的理论,就不得不明白辐射度量学的一些基本概念。

立体角

立体角,solid angle,我们使用ω来表示。它表示光束发散或会聚的程度,是一个光锥投射到单位球体表面上的表面积。

如果我们以光锥的基点为球心作一个球体表面,那么立体角的定义就是锥体在球体表面的截取部分的表面积(记为\(dS\))与球体半径(记为\(r\))平方的比值。如下。

\[ d\Omega = \frac {dS} {r^2} = \frac {r^2 \ast \sin{\theta} \ast d\theta \ast d\phi} {r^2} = \sin{\theta} \ast d\theta \ast d\phi \tag{1.1} \]

其中 \(\theta\) 为以垂直轴为原轴的pitch角度增量,而 \(\phi\) 则为yaw角度增量。可参考下图理解。

立体角

立体角的单位为球面度sr

由微分方程 \((1.1)\) 可知,在\(\Theta\)\(\Phi\)增量范围内的立体角便为下面方程\((1.2)\)的积分结果。

\[ \Omega = {\int}_{\Theta} {\int}_{\Phi} \sin{\theta} \ast d\theta \ast d\phi \tag{1.2} \]

众所周知,球体的表面积为

\[ S_{sphere}=4 \ast \pi \ast r^2 \]

那么物体从整个空间接收能量的立体角就是\(Ω_{sphere}=4 \ast \pi\)。但是我们面对的通常都不是一个通透的点,而是一个有方向的平面,它最多只能接收一半空间的辐射能。所以一个表面从整个空间接收辐射能的立体角就是

\[ \Omega_{flat} = 2 \ast \pi \tag{1.3} \]

这个一半空间便是此平面对应的半球领域,即hemisphere

立体角可以理解为一个带有体积的方向。如下图所示。

带有体积的方向

此立体角可以表示一束光,这束光从某个方向照到平面中心,这是光的方向。而立体角则表示这束光在单位球体上的表面积,光束越粗,表面积越大。所以说立体角可以很好地将一束光模拟成一个带有体积的方向。

辐射能

辐射能是辐射能量在一段体积、一段时间、一段方向上的积累。是辐射的能量值。单位焦耳(J)。这里使用\(Q\)来表示。

我们分别用下面的三个度量来表示其进一步的分布特性。

辐能密度

单位体积的辐射能。单位为焦耳每立方米(\(J⁄m^3\))。这里使用\(\omega\)来表示。即有

\[ \omega = \frac { dQ } { dV } \tag{1.4} \]

用来表示辐射能的空间特性。

辐射通量

单位时间的辐射能。所以也叫辐射功率。单位为瓦特(W),即焦耳每秒(\(J⁄s\))。这里使用\(\Phi\)来表示。即有

\[ \Phi = \frac { dQ } { dt } \tag{1.5} \]

用来表示辐射能的时间特性。

辐射强度

单位立体角的辐射通量。单位为瓦特每球面度(\(W⁄sr\))。这里使用\(I\)来表示。即

\[ I = \frac { d\Phi } { d\Omega } \tag{1.6} \]

用来表示辐射能的方向特性。

有了辐射能及上面这些基本概念之后,我们还无法直接和进行光照计算的光照强度直接联系起来。接下来需要做的是将光的传播方向与其照射到的平面的法线方向联系起来,从而推导出真正的光照强度。

辐射亮度辐射照度所做的就是这件事情。

辐射亮度

光源投射到一个平面时,与平面法线的夹角不同,则投射到平面上的能量也不同。而辐射亮度需要解决这种方向上的差异,所以它的定义是光源投射到与光源方向所垂直的平面上发出的辐射通量。

即,光在光源方向的垂直方向上单位表面积单位立体角所发出的辐射通量。也可以说是单位表面积所发出的辐射强度。这里使用\(L\)表示。单位为瓦特每球面度平方米(\(W⁄(sr \ast m^2)\))。即

\[ L = \frac {dI} {dA^{\bot}} \tag{1.7} \]

其中\(A^{\bot}\)为光源投射平面在光源方向的垂直方向的投影。可参考下图理解。

垂直方向的投影平面

所以设\(\theta\)为光源方向与平面法线的夹角,则有

\[ dA^{\bot} = dA \ast \cos{\theta} \tag{1.8} \]

那么由\((1.6)(1.7)(1.8)\)可以推导出最后的辐射亮度的表示公式如下。

\[ L = \frac {dI} {dA^{\bot}} = \frac {d(\frac{d\Phi}{d\Omega})} {dA^{\bot}} = \frac {d^2\Phi} {d\Omega \ast dA^{\bot}} = \frac {d^2\Phi} {d\Omega \ast dA \ast \cos{\theta}} \tag{1.9} \]

如果我们假设立体角为无穷小,那么\(\Omega\)将变为某个方向向量\(\vec{\omega}\) ,表示光源的方向。如果我们把平面看作无穷小,那么\(A\)将变为某个点(片段)p(其面积仍为A)。则我们可以得到某个光源从\(\vec{\omega}\)方向照射到点\(p\)上的辐射亮度为

\[ L(p, \vec{\omega}) = \frac {d^2\Phi} {d\vec{\omega} \ast dA \ast \cos{\theta}} \tag{1.10} \]

辐射亮度又称辐射度辐射率(radiance)

辐射照度

辐射照度(irradiance)的定义与辐射亮度类似。它表示光在单位表面积所发出的辐射通量。这里使用\(E\)表示。单位为瓦特每平方米(\(W⁄m^2\))。即

\[ E = \frac {d\Phi} {dA} \tag{1.11} \]

从定义就可以看出。辐射照度与辐射亮度的区别是,辐射照度没有考虑光源的方向,也没有考虑平面的方向,而是对于所有的方向(半球领域)来说的。所以可以说它是辐射亮度在半球领域对立体角的积分。而辐射亮度则是辐射照度在某个单位立体角上的微分。

与此同时,由\((1.9)(1.11)\)可得

\[ L = \frac {d^2\Phi} {d\Omega \ast dA \ast \cos{\theta}} = \frac {dE} {d\Omega \ast \cos{\theta}} \tag{1.12} \]

则有

\[ dE = L \ast d\Omega \ast \cos{\theta} \tag{1.13} \]

我们同样把\(\Omega\)\(A\)假设为无穷小,则有

\[ dE(p, \vec{\omega}) = L(p, \vec{\omega}) \ast d\vec{\omega} \ast \cos{\theta} \tag{1.14} \]

此处的\(dE(p,\vec{\omega})\)表示从某个入射方向\(\vec{\omega}\)所贡献的辐射通量,它是一个微分辐射照度。而\(E\)则表示来自于整个半球领域的辐射照度总和。

BRDF与渲染方程

BRDF

BRDF全称双向反射分布函数(Bidirectional Reflective Distribution Function)。

在现实生活中,我们人眼所看到的一个表面,实际上是所有辐射到它上面的光,再反射到我们的眼睛里来。而BRDF所描述的就是这个反射光强与入射光强的关系。

它表示某个观察方向上的出射的辐射通量与从某个光源方向入射的总辐射通量的比值。假设光源入射方向为\(\vec{l}\),观察方向为\(\vec{v}\)。则有

\[ f(p, \vec{l}, \vec{v}) = \frac {dL(p, \vec{v})} {dE(p, \vec{l})} \tag{1.15} \]

对于分子\(dL(p, \vec{v})\)\(L\)表示的是入射光来自整个半球领域时在方向\(\vec{v}\)上的出射辐射亮度,所以\(dL\)为其微分,而且是对\(\vec{l}\)的微分,表示入射光来自\(\vec{l}\)方向时的出射辐射亮度。

对于分母\(dE(p, \vec{l})\)\(E\)表示的是来自整个半球领域入射辐射照度,所以\(dE\)为其微分,表示入射光仅来自\(\vec{l}\)方向时的入射辐射照度。

虽然BRDF是一个比值,但是从\((1.15)\)可以看出来,它的单位并非是1,而是\(1/sr\)

这是因为\(E\)是总的辐射照度,它既不考虑入射光的方向,也不考虑出射光的方向,即入射出射都为整个半球领域,而\(dE\)\(E\)的积分,它考虑了入射方向,即入射为某个方向,而出射是整个半球领域。

同时,\(L\)是入射光来自整个半球领域时的辐射亮度,所以它也要对\(\vec{l}\)进行微分,而它本身便是关于\(\vec{v}\)的一个微分,所以它的入射和出射都是某个方向。

由此可见,分子比分母少了一个半球领域(出射也是某个方向),那么单位是\(1/sr\)自然说的通了。

反射率方程

反射率表示在某个观察方向\(\vec{v}\)上的出射的辐射亮度。当然入射源料是整个半球领域的光线。

由$(1.15)可得

\[ dL(p, \vec{v}) = f(p, \vec{l}, \vec{v}) \ast dE(p, \vec{l}) \tag{1.16} \]

再由\((1.14)(1.16)\)可得

\[ dL(p, \vec{v}) = f(p, \vec{l}, \vec{v}) \ast L(p, \vec{l}) \ast d\vec{l} \ast \cos{\theta} \tag{1.17} \]

此处的 \(dL(p, \vec{v})\)为对\(\vec{l}\)的微分,表示入射源料为\(\vec{l}\)方向上时,从\(\vec{v}\)出射的辐射亮度。

所以我们对入射方向\(\vec{l}\)求一个半球领域的积分,便可得到在观察方向\(\vec{v}\)上出射的辐射亮度。即

\[ L(p, \vec{v}) = \int_{\vec{l}_i \in \Omega} f(p, \vec{l}_i, \vec{v}) \ast L(p, \vec{l}_i) \ast \cos{\theta} \ast d\vec{l}_i \tag{1.18} \]

\(\theta\)为平面的法线\(\vec{n}\)与光源方向\(\vec{l}_i\)的夹角,所以有

\[ \cos{\theta} = \vec{n} \cdot \vec{l}_{i} \]

则有

\[ \color{red} { L(p, \vec{v}) = \int_{\vec{l}_i \in \Omega} f(p, \vec{l}_i, \vec{v}) \ast L(p, \vec{l}_i) \ast (\vec{n} \cdot \vec{l}_{i}) \ast d\vec{l}_i } \tag{1.19} \]

此即反射率方程(Reflectance Equation),也是我们最终要输出的光照强度。所以公式\((1.19)\)至关重要。

渲染方程

反射率方程只考虑了物体反射周围光源得到的辐射亮度,但是并没有考虑物体本身就含有辐射能,如自发光物体,这称为放射光强,所以一个物体最终得到的颜色便是这两种能量的总和,即

\[ L = L_e + L_r(p, \vec{v}) \tag{1.20} \]

此即渲染方程(Rendering Equation)。而反射率方程只是渲染方程的一个特化版本,但是这里我们使用反射率方程就已经足够说明问题了。

微平面与能量守恒

微平面

微平面(microfacets)即微观尺度的平面。PBR的理论都是基于微平面的。

在宏观平面中,一个平面总是平滑的,其法线在此平面的处处都相等且都垂直于该平面。

但是从微观的角度来看,这个平面由许多肉眼看不到的微小平面组成,这些微小平面的方向(法线)各不相同。

我们使用粗糙度(roughness)来表示一个宏观平面中微平面方向不相同的程度,即宏观平面的粗糙程度。

粗糙度

一个平面越粗糙,则这个平面上的微平面的排列就越混乱。从而产生分布更广的镜面反射。反之则会产生更尖锐的镜面反射。

借鉴Blinn_Phong模型,如果半程向量(halfway vector)与法线的方向一致,则镜面反射光线正好进入人眼。那么,对于一个给定的半程向量,这种方向一致的法线越多,镜面反射光线进入人眼的比例越多,我们就可以说这个平面越光滑,反之越粗糙。

粗糙度(roughness)就是用来计算半程向量与微平面的法线方向一致的概率的。粗糙度越小越一致,平面越光滑。

粗糙度的取值范围为[0.0, 1.0]

能量守恒

为了得到更真实的光照计算,以及统一光照强度的单位,PBR需要遵守能量守恒定律。

我们将一束照射到平面的光分为两部分,反射和折射。

对于反射部分,则是直接反射出去,不会进入平面内部的光,也就是镜面光照。

对于折射部分,则会进入平面内部,与平面材料的微粒进行碰撞,将光能转化为动能。

所以说,出射光的反射光线折射光线加起来会等于入射光线。假设反射光的比例系数为 \(k_s\) ,那么折射光的比例系统便为\(1.0-k_s\)

其中反射光线即为镜面光照。而折射光线有的会被吸收,有的则重新从平面再反射出来,重新反射出来的便是次表面散射。次表面散射出的光线组成了光照的漫反射部分,下面解释这句话。

次表面散射

折射进入平面内部的光线,在内部经多次粒子碰撞之后,会重新从平面射出,这便是次表面散射,如下图所示。

次表面散射

从宏观角度来看,次表面散射需要另外的方法重新建模。此时光线会从另外一个平面射出。如下图所示。

宏观尺度的次表面散射

但是从微观角度来看,次表面散射的实质就是漫反射。因为光线并没有逃出我们的观察点,只不过不是直接反射的方向而已,所以我们会说次表面散射出来的光组成了光照的漫反射部分。如下图所示。

微观尺度的次表面散射微观尺度的次表面散射

金属性

并非所有的物质的折射光都会转化为次表面散射,对于金属而言,所有的折射光都会被直接吸收而不会散开。

除此之外,金属的菲涅尔现象也与电介质或者非金属不同。为了更真实地模拟金属以及更多现实中的材质,需要引入金属度(metallic)作为参数来调节光照效果。

Cook-Torrance BRDF

观察反射率方程\((1.19)\),可以发现,要想获得最终的光照强度,必须求得brdf项,即\(f(p, \vec{l}, \vec{v})\)

所以我们必须建立一个符合物理规律的brdf函数模型,这个函数输入光源入射方向\(\vec{l}\)观察方向\(\vec{v}\),输出值域为[0.0, 1.0]

事实上,Blinn_Phong模型本质上也是一个brdf模型,只不过它不满足能量守恒,且不是基于微平面的,并不是一个基于物理的brdf模型。

而我们这里使用的模型称为Cook-Torrance模型,它是一个基于物理的brdf模型,自1981年被Cook-Torrance引入图形学领域之后,一直被作为基于物理渲染的标准框架模型。

下面介绍该模型的一些基本概念以及最终的推导过程。

法线分布函数

法线分布函数(NDF),记作\(D(p, \vec{h})\),意思是,输入一个朝向\(\vec{h}\),返回组成宏观平面\(p\)所有微平面法线\(\vec{h}\)相同的微平面占总微平面的比例。故返回值域为[0.0, 1.0]

这里的\(\vec{h}\)半程向量,也是宏观平面\(p\)微观法线,即\(p\)中法线不是\(\vec{h}\)的微平面的反射光线不会进入人眼,可以将光反射进入人眼的微平面的法线都是\(\vec{h}\)

法线分布函数

关于法线分布函数的建模,大都是基于统计学来估算的,或者基于显微镜下某种特定材质的表面形状特性来建模决定的。

几何分布函数

事实上,并非所有的法线方向与\(\vec{h}\)相同的微平面都会将光线反射进人眼。如下图所示。

几何阴影几何遮蔽正常

如图所示,微平面本身的凹凸不平可能会导致自身的遮挡而反射不出去光线。

其中有的微平面是因为接收不到入射光,造成几何阴影,如左图。

有的是因为反射的光线被其他的微平面所遮蔽,造成几何遮蔽,如中图。

有的则可以正常反射出去,形成宏观平面的漫反射光照,如右图。

几何函数G,记为\(G(p, \vec{l}, \vec{v})\),意思是说,输入一个光源方向\(\vec{l}\),和一个观察方向\(\vec{v}\)。那么输出能从\(\vec{v}\)反射出的光线占输入光线的比例。它的值域也是[0.0, 1.0]

关于几何函数的建模,也是基于统计学来估算的,或者基于显微镜下某种特定材质的表面形状特性来建模决定的。

菲涅尔方程

在上文能量守恒小节中我们提到过,入射的光线可以分为反射光和折射光两个部分。而菲涅尔方程的作用就是可以得到反射的光线占总光线的比例。而且这个比例随我们的观察方向\(\vec{v}\)的不同而不同。

菲涅尔方程F(Fresnel),记为\(F(p, \vec{l}, \vec{v})\),意思是说,输入一个光源方向\(\vec{l}\),和一个观察方向\(\vec{v}\),由这二者计算(向量和)得到半程向量\(\vec{h}\),也即\(p\)微观法线,那么根据\(\vec{v}\)\(\vec{h}\)的夹角,返回反射光线占总光线的比例。所以它的值域也是[0.0, 1.0]

但是真实的菲涅尔方程十分复杂,这里是使用Fresnel-Schlick近似法求到的。

Cook-Torrance BRDF 的推导

有了上面这些概念,我们就可以尝试推导Cook-Torrance BRDF模型公式。

我们将Cook-Torrance BRDF分为两个部分,一个是Lambert漫反射项,一个才是Cook-Torrance镜面反射项。

\[ f(p, \vec{l}, \vec{v}) = f_{lambert} (p, \vec{l}, \vec{v}) + f_{cook\_torrance} (p, \vec{l}, \vec{v}) \tag{1.21} \]

Lambert项的推导

对于漫反射项,我们直接使用Lambert漫反射定律,可参考笔者的另一篇介绍Blinn_Phong光照模型的文章(好像还没有写)。

\[ f_{lambert} (p, \vec{l}, \vec{v}) = k_d \ast \frac {C_{diffuse}} {\pi} \tag{1.22} \]

其中\(k_d\)为漫反射系数。

\(C_{diffuse}\)为漫反射颜色。

而这里的\(\pi\)是为了标准化漫反射光,以消除反射率方程\((1.19)\)中积分的影响。

Lambert定律中的\((\vec{n} \cdot \vec{l})\)项也因为积分公式里已经包含可不需要再次作为因子。故漫反射部分即为\((1.22)\)公式所示。

Cook-Torrance项的推导

Cook-Torrane项最终的结果形式如下。

\[ \color{red} { f_{cook\_torrance}(p, \vec{l}, \vec{v}) = \frac {D(p, \vec{h}) \ast G(p, \vec{l}, \vec{v}) \ast F(p, \vec{l}, \vec{v})} {4 \ast (\vec{n} \cdot \vec{v}) \ast (\vec{n} \cdot \vec{l})} } \tag{1.23} \]

其中\(\vec{v}\)为人眼的观察方向向量

其中\(\vec{n}\)为平面\(p\)宏观法线

其中\(h=normalize(\vec{v} + \vec{l})\)为平面\(p\)微观法线,也是半程向量。

下面是推导过程。

现在假设有一束光沿\(\vec{l}\)方向照射宏观平面\(p\)上,我们从方向\(\vec{v}\)上观察此平面。设\(\vec{h}\)为此时的半程向量,即\(p\)的微观法线。

则由\((1.10)\)可得,此束光的入射辐射通量为

\[ d^2\Phi(p, \vec{l}) = L(p, \vec{l}) \ast d\vec{l} \ast dA_{\vec{h}} \ast (\vec{h} \cdot \vec{l}) \tag{1.24} \]

这里的\(dA_{\vec{h}}\)为平面\(p\)中所有法线方向\(\vec{h}\)微平面的面积总和。那么显示可以由法线分布函数得到该项。

\[ dA_{\vec{h}} = D(p, \vec{h}) \ast d\vec{h} \ast dA \tag{1.25} \]

这里之所以要乘以\(d\vec{h}\)是因为,法线分布函数是对于单位面积单位立体角而言的,所以我们要乘以\(d\vec{h}\)这个立体角,以获得这个立体角对应的概率。

\((1.24)\)可变形为

\[ d^2\Phi(p, \vec{l}) = L(p, \vec{l}) \ast d\vec{l} \ast D(p, \vec{h}) \ast d\vec{h} \ast dA \ast (\vec{h} \cdot \vec{l}) \tag{1.26} \]

这便是入射辐射通量的最终形式了。

又菲涅尔方程为反射出的能量占入射能量的比例,所以我们可以得到反射辐射通量如下。

\[ d\Phi(p, \vec{v}) = F(p, \vec{l}, \vec{v}) \ast d^2\Phi(p, \vec{l}) \tag{1.27} \]

\[ d\Phi(p, \vec{v}) = F(p, \vec{l}, \vec{v}) \ast L(p, \vec{l}) \ast d\vec{l} \ast D(p, \vec{h}) \ast d\vec{h} \ast dA \ast (\vec{h} \cdot \vec{l}) \tag{1.28} \]

这里之所以把二重微分变为一重,是因为出射辐射通量不需要积分,只是某个方向上的辐射通量而已。

\((1.28)\)便是出射辐射通量的最终形式了。

有了出射辐射通量,我们就可以进一步求得出射辐射亮度了。

还是由\((1.10)\),可得

\[ dL(p, \vec{v}) = \frac {d\Phi(p, \vec{v})} {d\vec{v} \ast dA \ast (\vec{n} \cdot \vec{v})} \tag{1.29} \]

代入\((1.28)\),可得

\[ \require{cancel} \\ dL(p, \vec{v}) = \frac { F(p, \vec{l}, \vec{v}) \ast L(p, \vec{l}) \ast d\vec{l} \ast D(p, \vec{h}) \ast d\vec{h} \cancel{\ast dA} \ast (\vec{h} \cdot \vec{l}) } {d\vec{v} \cancel{\ast dA} \ast (\vec{n} \cdot \vec{v})} \tag{1.30} \]

又由\((1.17)\),可得

\[ f(p, \vec{l}, \vec{v}) = \frac {dL(p, \vec{v})} {L(p, \vec{l}) \ast d\vec{l} \ast (\vec{n} \cdot \vec{l})} \]

代入\((1.30)\),可得

\[ \require{cancel} \\ f(p, \vec{l}, \vec{v}) = \frac { F(p, \vec{l}, \vec{v}) \ast \cancel{L(p, \vec{l}) \ast d\vec{l} \ast} D(p, \vec{h}) \ast d\vec{h} \ast (\vec{h} \cdot \vec{l}) } { d\vec{v} \ast (\vec{n} \cdot \vec{v}) \ast \cancel{L(p, \vec{l}) \ast d\vec{l} \ast} (\vec{n} \cdot \vec{l}) } \tag{1.31} \]

\[ \require{cancel} \\ f(p, \vec{l}, \vec{v}) = \frac { F(p, \vec{l}, \vec{v}) \ast D(p, \vec{h}) \ast d\vec{h} \ast (\vec{h} \cdot \vec{l}) } { d\vec{v} \ast (\vec{n} \cdot \vec{v}) \ast (\vec{n} \cdot \vec{l}) } \tag{1.32} \]

其中

\[ \frac {d\vec{h}} {d\vec{v}} = \frac {1} {4 \ast (\vec{h} \cdot \vec{l})} \tag{1.33} \]

关于\((1.33)\),我们会在紧接着下面的内容进行证明,现在先认为这个公式是已证得成立的,用其来化简\((1.32)\),可得

\[ f(p, \vec{l}, \vec{v}) = \frac { F(p, \vec{l}, \vec{v}) \ast D(p, \vec{h}) } { 4 \ast (\vec{n} \cdot \vec{v}) \ast (\vec{n} \cdot \vec{l}) } \tag{1.34} \]

除此之外,还要考虑几何函数G的影响,即

\[ \color{red} { f(p, \vec{l}, \vec{v}) = \frac { F(p, \vec{l}, \vec{v}) \ast D(p, \vec{h}) \ast G(p, \vec{l}, \vec{v}) } { 4 \ast (\vec{n} \cdot \vec{v}) \ast (\vec{n} \cdot \vec{l}) } } \tag{1.35} \]

对比\((1.23)\)可发现其与\((1.35)\)是一样的,说明我们只要能证明\((1.33)\)是正确的,那么我们对Cook-Torrance BRDF公式的推导就算完成了。

下面来证。

\(^o^)/

\(\frac{d\vec{h}}{d\vec{v}}\) 的推导

dh/dv

如图所示,入射光线\(\vec{in}\)与单位球体交点为I,反射光线\(\vec{out}\)与单位球体交点为R,入射角为\(\theta\),其中间向量\(\vec{h}\)与单位球体的交点为Q

蓝色的锥体为\(d\vec{h}\),是微观法线的立体角微分,其在单位球体上的投影面积为\(dA_{\vec{h}}\)

红色的锥体为\(d\vec{v}\),是观察方向的立体角微分,其在单位球体上的投影面积为\(dA_{\vec{v}}\)。故有

\[ \frac {d\vec{h}} {d\vec{v}} = \frac {dA_{\vec{h}}} {dA_{\vec{v}}} \tag{1.36} \]

然后我们就可以利用一些小小的数学技巧来计算这两个面积的比值,而非两个立体角的比值。

dh/dv的推导

如图所示。连接IR,交\(\vec{h}\)于一点P,显然点P线段IR的中点。

过点P作锥体 \(I-dA_{\vec{v}}\) 的截面,记为 \(dA_t\)

此截面与 \(dA_{\vec{v}}\) 平行,且同时为锥体 \(dA_{\vec{h}}\) 的截面。

过点Q作与截面 \(dA_t\) 平行且为锥体 \(dA_{\vec{h}}\) 截面的截面,记 \(dA_{tt}\)

由于 \(\frac{IP}{IR} = \frac{1}{2}\),所以两截面的面积比为\(\frac{1}{4}\),即

\[ \frac {dA_t} {dA_{\vec{v}}} = \frac{1}{4} \tag{1.37} \]

\(\frac{OP}{OQ} = \frac{OP}{OI} = \cos{\theta} = (\vec{h} \cdot \vec{l})\),所以同理有

\[ \frac{dA_t}{dA_{tt}} = (\vec{h} \cdot \vec{l})^2 \tag{1.38} \]

又由图,显然有

\[ dA_{\vec{h}} = dA_{tt} \ast \cos{\theta} = dA_{tt} \ast (\vec{h} \cdot \vec{l}) \tag{1.39} \]

结合上面三式可得

\[ \frac {d\vec{h}} {d\vec{v}} = \frac {dA_{\vec{h}}}{dA_{\vec{v}}} = \frac {dA_{tt} \ast (\vec{h} \cdot \vec{l})} {dA_t \ast 4} = \frac {\cancel{(\vec{h} \cdot \vec{l})}} {(\vec{h} \cdot \vec{l})^{\cancel{2}}} = \frac {1} {(\vec{h} \cdot \vec{l}) \ast 4} \tag{1.40} \]

证毕。

\(^o^)/

但是这里只是在某篇上古论文里看到的一种解法,其中尚有些不解之处,听说真正的数学证法是利用雅克比换元法进行换元得出行列式,再进行化简,具体过程需要等以后更强大了再来了解,暂时先认为上面这种解决是正确的。

结语

本文系统详细地介绍了实现PBR的理论知识,使用了40个公式,对辐射度量学基础、BRDF与渲染方程、微平面、能量守恒以及Cook-Torrance BRDF的证明都都进行了详细的整理。

但是限于笔者水平十分有限,有的地方难免会有些曲解,希望有人发现了可以及时指正,不胜感激。

到此为止,便可认为具备了实现PBR的理论基础,后面两篇博文将重点整理一下以这些理论为基础对PBR模型的实现细节,包括直接光照基于IBL(Image Based Lighting)间接光照