type
Post
status
Published
date
Mar 30, 2023
slug
summary
上章详细介绍了PBR的核心原理:光学理论和物质交互的原理。这章将深入介绍PBR核心原理相关的理论,并对其中一些公式做推导或详细阐述,使读者对PBR的关联技术和原理有更彻底的理解。主要面向:
• 高阶程序员
• 想全面且透彻了解PBR底层原理及理论的人数学物理( Mathematical Physics)是一门数学和物理相结合的学科,意图将物理现象和理论用数学公式或理论表达出来。本章主要是跟数学物理相关的内容。
tags
Shader
category
技术分享
icon
password
五. 高阶:PBR关联理论和推导
上章详细介绍了PBR的核心原理:光学理论和物质交互的原理。
这章将深入介绍PBR核心原理相关的理论,并对其中一些公式做推导或详细阐述,使读者对PBR的关联技术和原理有更彻底的理解。
主要面向:
- 高阶程序员
- 想全面且透彻了解PBR底层原理及理论的人
数学物理( Mathematical Physics)是一门数学和物理相结合的学科,意图将物理现象和理论用数学公式或理论表达出来。本章主要是跟数学物理相关的内容。
5.1 微积分(Calculus)
由于微积分可以解决很多物理学上的现象或问题,比如光照辐射度量、电磁场、量场等等,所以很有必要重温一下微积分的基础知识。
微积分是数学的一门基础学科,是高等数学中研究函数的一个分支。它包含的主要内容有:
- 微分学(Differentiation):它是一套描述函数变化率的理论及求导数的运算,将函数、速度、加速度和曲线斜率归集起来,以便用一套统一通用的符号进行讨论和计算。包含的内容:
- 极限理论(Limit Theory)
- 导数(Derivative)
- 微分(Differentiation)
- 积分学(Integration):为定义和计算面积、体积等提供一套通用的方法。包含的内容:
- 定积分(Definite integration)
- 不定积分(Indefinite integration)
5.1.1 微分(Differentiation)
5.1.1.1 函数极限(Functional Limit)
- 极限的概念:设是给定函数,如果自变量在定义域内按照某种趋势变化时,若时,函数值与某个常数可无限接近(甚至相等),则称在此变化过程中有极限,为其极限,记做,否则称在此过程中无极限。
例如,函数,它的曲线如下图,从中可以观察到,当无限趋近于0时,也趋近于0,用公式表达就是:。

- 极限的性质(假设和均存在,为常数):
- ()
- (极限与左、右极限的关系)
- 重要极限:
- 重要极限1,跟三角函数相关:
- 重要极限2,跟自然常数相关,有两种表达形式:
其中曲线图如下:

可以将扩展到:
利用这一重要极限,可以求得一系列涉及三角函数的极限。
其中是无理数,。
可以将扩展到:
5.1.1.2 导数(Derivative)
- 导数的定义:
设在和有定义,则函数有增量。如果极限
存在,则称在可导,称极限值为在处的导数(其实就是斜率、变化率),可记为以下几种形式:
- 求导步骤:
- 对给定的,求出。
- 计算并化简。
- 求。
比如,求的导数,分为以下步骤:
更抽象地,对幂函数的导数:
- 求导法则:
- 基本运算求导法则:设和是的可导函数,且,则:
- 复合函数求导法则:设是由和组成的复合函数,并且设可导,也可导,则复合函数的导数为:
- 反函数的导数:反函数的导数等于原来函数导数的倒数。
- 隐函数的导数:如果方程确定了是的函数,那么,这样的函数叫做隐函数。
设为常数,则。
其它常见函数的导数:
还有其它几种等价表示形式:
以上法则也叫链式求导法则,它表明:复合函数的导数等于函数对中间变量的导数乘以中间变量对自变量的导数。
更具体地,设单调函数,则它的反函数是,则有:
若隐函数关于可导,则可根据复合函数求导法则求出函数对的导数。
- 高阶导数:
一般情况下,函数的导数仍然是的函数。如果仍然可导,则把的导数称为函数的二阶导数,记作或,也可用以下表达式:
若二阶导数仍然可导,则二阶导数的导数称为函数的三阶导数,记作或。
二阶及以上的导数统称为高阶导数。
5.1.1.3 微分(Differentiation)
- 微分的定义:
设函数在点处可导,则把函数在处的导数与自变量在处的增量之积称为函数在点处的微分,记做,即,这时称函数在点处可微。
对自变量的微分,可以认为是对函数的微分,有以下等式:
故而,的微分又可记为,推导出:。
也就是说,函数的微分与自变量的微分之商是函数的导数。因此,函数的导数也叫微商(注意,跟朋友圈的微商概念不一样o_o!!)。
也就是说,函数在处可微与可导等价。
- 微分的几何意义:
如下图所示,是曲线上的点处的切线,设它与轴正向的夹角为,则,所以,即函数在处相对于的微分。
也就是说,微分的几何意义是曲线上点的切线的纵坐标的改变量。

- 微分公式和法则:
由于微分,也就是说,只要求出函数的导数,即可求得对应的微分。
因而求导数和求微分的方法统称为微分法。
导数和微分之间的公式和法则高度一致:
导数公式 | 微分公式 |
导数法则 | 微分法则 |
- 一阶微分形式不变性:
不论是自变量还是中间变量,函数的微分形式总是:
此性质就是一阶微分形式不变性。
5.1.2 积分(Integration)
5.1.2.1 不定积分(Indefinite integration)
- 原函数:如果在区间上,可导函数的导函数为,即当时,即
则是在区间上的原函数。
- 原函数存在定理:连续函数一定有原函数。
- 不定积分定义:
在区间上,函数的带有任意常数项的原函数称为(或)在区间上的不定积分,记做
其中符号称为积分号,为被积函数,为被积表达式,为积分变量。
求一个函数的不定积分实际上只需求出它的一个原函数,再加上一个任意常数:
- 不定积分的性质:
- ,或
- ,或
- (是常数且)
由上面两个性质可得出:微分运算与不定积分运算互为逆运算,当它们的符号连在一起时,可抵消,抵消后可能相差一个常数。
速记口诀:先积后微,形式不变;先微后积,差一常数。
与求积分变量无关的常数,可以提出积分号。
- 常见积分表:
- 积分的方法:
- 直接积分法:利用不定积分的4个性质求不定积分。
- 换元积分法:
- 设具有原函数,可导,则有换元公式:
- 设连续,的导数也连续,且,假若
- 分部积分法:
例如,求。
因为,所以。
则有换元公式:
其中为的反函数。
分部积分法由两个函数乘积的导数公式推导而来,最终形式:
若是分部的一部分有困难时,可以尝试另外一部分可能相对容易,这就是分部积分法的作用。
5.1.2.2 定积分(Definite integration)
定积分是积分学的另一个重要概念,自然科学与生产实践中的许多问题,如平面图形的面积、曲线的弧长、水压力、变力所做的功等都可以归结为定积分问题。
计算机图形学的很多计算问题也归结于定积分问题,如辐射度量、采样、卷积、预计算等等。
- 定积分的定义:

设在区间上有界,在中插入若干个分点
把区间分成个小区间
各个小区间的长度依次为
在每个小区间上任取一点,取函数值与小区间长度的乘积,再求和
记,当时,和的极限(有限)存在且的划分和无关,则成函数在上可积,且称这个极限为函数在区间上的定积分(简称积分),记作
其中称为被积函数,为被积表达式,为积分变量,为积分下限,为积分上限,为积分区间。
- 定积分性质:
- 设在区间上连续,则在上可积。
- 设在区间上有界,且只有有限个间断点,则在上可积。
- 当时,
- 当时,
- 设,则
- 设,,则
- 设,且,则
- 设,且,则
- 定积分估值定理:如果,即、分别是在区间的最小、最大值,那么
- 定积分中值定理:如果函数在上连续,则至少存在一点,使得
- 如果函数在区间上连续,则积分上限的函数
- 如果函数在区间上连续,则函数
- 牛顿-莱布尼兹公式(Newton-Leibniz Formula):如果函数是连续的,是在区间上的一个原函数,则
在上可导,并且它的导数
就是在区间上的一个原函数。
也叫微积分基本公式。它揭示了被积函数与原函数之间的联系,说明一个连续函数在区间上的定积分等于它的任意一个原函数在区间上的增量,它为定积分的计算提供了一个简单而有效的方法。
- 定积分的方法:
有换元法、分部积分法,跟不定积分类似,唯一的区别是加了区间限制,不再累述。
微积分就介绍到这里了,其它更多高级的概念和性质,如多元微积分、多重微积分、无穷级数、幂级数等等,可以另外找资料,也可以在参考文献里寻得。
5.2 辐射度量(Radiometry,Radiation Measure)
章节3.1.3 反射方程和4.2.6 光的能量已经列出了辐射度量的基本概念、符合、公式,本小节将做一些补充。
5.2.1 立体角(Solid Angle)
在二维平面几何中,弧度(Radian,rad)是测量角度的标准单位,表示了与圆心角与其对应的圆弧长度的关系,见下图:

上图动态地描述了圆半径如何转化成圆弧,以及圆心角与弧度的对应关系。
可以明显看出,弧度只是衡量角度大小,跟半径无关,所以弧度的计算方式是圆弧的长度除以圆半径:
如果对角度和弧长进行微分,就可用微分的方式表达(表示微分的弧长):
同样地,在三维立体几何中,也有跟弧度类似的概念,用来衡量三维球体的圆心角,它就是立体角(宏观符号,微分符号)。
立体角的定义,用公式表达就是:

从上面可以看出,立体角与球体半径无关,由于是三维立体空间,且1单位立体角的球表面面积为(上图),所以半径的影响因子就是,用宏观符号公式表达:
其中(Steradian)是立体角的单位,叫立体弧度或球面度。
若对立体角和球表面面积微分,可得到微分形式的公式:
利用Spherical Cap的面积公式,可求得半个球体的立体角:
也就是说半个球体的立体角为,整个球体的立体角为:
5.2.2 辐射强度(Radiant Intensity)

辐射强度指通过单位立体角的辐射通量。用符号表示,单位W/,微分公式:
既然已有了辐照度和辐射度,为什么还要引入辐射强度呢?
原因是在计算辐射时,有时会考虑某个点的通量的密度,但一个点的面积是0,无法用辐照度和辐射度的公式,故而引入跟面积无关的辐射强度。而辐射强度之所以跟面积无关,是因为立体角只跟角度相关,跟球体的半径、距离、面积无关。
也就是说,由于立体角不会随距离变化而变化,辐射强度不会随距离变化而变化,不像点光源的辐照度会随距离增大而衰减。
5.2.3 辐射率(Radiance)
辐射率是测量微小方向照到微小表面的通量,即每单位面积每单位立体角的辐射通量密度。用公式表达:

辐射率实际上就是材质的颜色,在基于物理着色时,计算表面一点的颜色就是计算它的辐射率。
辐射率不会随距离变化而衰减,这和真实世界的物理原理一致:在没有空气干扰的情况下,我们看到的物体颜色并不会随距离变化而变化。
5.3 公式推导
5.3.1 麦克斯韦方程组(Maxwell's equations)
既然光的很多现象,包括反射、折射定律都可以用麦克斯韦方程组解释,那我们就有必要揭开它的神秘面纱。
麦克斯韦方程组是描述了电场、磁场与电荷密度、电流密度之间关系的偏微分方程。利用麦克斯韦方程组,可以推论出电磁波在真空中以光速传播,并进而做出光是电磁波的猜想。
实际上,麦克斯韦方程组虽然由英国物理数学家詹姆斯·克拉克·麦克斯韦(James Clerk Maxwell)提出,但最初提出来时有20个方程和20个变量。后来由英国物理学家奥利弗·赫维赛德(Oliver Heaviside)和美国物理数学家约西亚·威拉德·吉布斯(Josiah Willard Gibbs)以矢量分析的形式重新表达,也就是现在我们使用的形式。
麦克斯韦方程组和洛伦兹力方程是经典电磁学的基础方程。从这些基础方程的相关理论,发展出现代的电力科技与电子科技。
它由4个方程组成:
- 高斯定律(Gauss' law):描述电场与空间中电荷分布的关系。
- 高斯磁定律(Gauss's law for magnetism):表明磁场的散度等于零,也就是说进入任何区域的磁场线,必需从该区域离开。
- 法拉第定律(Faraday's law):描述时变磁场怎样感应出电场。
- 麦克斯韦-安培定律(Ampère's law with Maxwell's addition):阐明磁场的产生方式有两种:一种是靠传导电流;另一种是靠时变电场,或称位移电流。
5.3.1.1 高斯定律(Gauss' law)
高斯定律表明在静电场中,穿过任一封闭曲面的电场通量只与封闭曲面内的电荷的代数和有关,且等于封闭曲面的电荷的代数和除以真空中的电容率。用积分形式表达的公式:
其中,是穿过封闭曲面的电场通量,是封闭曲面内的总电荷,是真空中的电容率。
若是更严谨一些,引入封闭曲面和及封闭曲面包含的体积,则有积分形式的公式:
其中是电场,是是封闭曲面的一块极小的面积,表示封闭曲面面积,有些文献会写成、、,表达的都是曲面面积。
还可以用微分的形式表达:
其中是电场散度,是电荷密度。
由于微分形式是从微观层面描述的,从宏观维度上,可表达成:
其中表示电场散度,表示材质电容率,表示电场。此公式只适应与均匀、各向同性、非分散的线性物质。
5.3.1.2 高斯磁定律(Gauss's law for magnetism)
高斯磁定律表明磁场的散度等于零,因此磁场是一个螺线矢量场,还可以推断磁单极子不存在(下图)。磁的基本实体是磁偶极子,而不是磁荷。

用微分形式的公式:
表示磁场的散度。
同样地,可以用积分形式:
5.3.1.3 法拉第定律(Faraday's law)
法拉第定律描述时变磁场怎样感应出电场。在积分形式,它表明在闭环移动电荷所需的每单位电荷的工作量等于通过封闭表面的磁通量的减少速率。微分形式:
积分形式:
5.3.1.4 麦克斯韦-安培定律(Ampère's law with Maxwell's addition)
麦克斯韦-安培定律表明,磁场的产生有两种:
- 靠传导电流,也就是原本的安培定律;
- 靠时变电场,也被称作位移电流,这点是麦克斯韦修正项所提出。
微分形式的公式:
积分形式复杂一些:
由于标准的无法表示闭合曲面的符号,可能跟维基百科的有些出入,具体参看维基百科的麦克斯韦方程组。
5.3.2 几何光学基本定律的推导
几何光学有三条基本定律:
- 第一定律:入射波、反射波、折射波的波矢,与界面的法线共同包含于入射平面(下图)。
- 第二定律:反射角等于入射角。这定律称为反射定律。
- 第三定律:,也叫斯涅尔定律或折射定律。
它们可以由麦克斯韦方程组推导出来。

光波是电磁辐射,必须满足麦克斯韦方程组与伴随的边界条件,其中一条边界条件为,在边界的临近区域,电场平行于边界的分量必须具有连续性。假设边界为xy-平面,则在边界,有:
其中,、 、分别为在入射波、反射波、折射波(透射波)的电场平行于边界的分量。
假设入射波是频率为的单色平面波,则为了在任意时间满足边界条件,反射波、折射波的频率必定为 。设定、 、的形式分别为
其中,、 、分别是入射波、反射波、折射波的波矢,、、分别是入射波、反射波、折射波的波幅(可能是复值)。
为了在边界任意位置满足边界条件,相位变化必须一样,必须设定。因此,
、。不失一般性,假设,则立刻可以推断第一定律成立,入射波、反射波、折射波的波矢,与界面的法线共同包含于入射平面。
从波矢x-分量的相等式,可以得到。而在同一介质里,。所以,第二定律成立,入射角等于反射角。
应用折射率的定义式:,可以推断第三定律成立:;其中,、分别是折射介质的折射率与折射角。
从入射波、反射波、折射波之间的相位关系,就可以推导出几何光学的三条基础定律。
此外,还可以用费马原理、惠更斯原理、平移对称性推导出来,更多参看维基百科的Snell's Law。
5.3.3 Cook-Torrance BRDF推导
本节参考了基于物理着色:BRDF的公式推导部分。
假设有一束光照射到微表面上,入射光方向,视线方向,对反射到方向的反射光有贡献的微表面法线为半角向量,则这束光的微分通量是:
其中是法线为半角向量的微分微表面面积,在入射光线方向的投影,为入射光线和微表面法线的夹角。
Torrance-Sparrow将微分微表面面积定义为,Torrance-Sparrow将前两项解释为单位面积微平面中朝向为的微分面积。
要从一组微表面面积dA中得到朝向为的微表面面积,只需要将定义为中朝向为的比例,取值范围在就可以了。这里引入的实际用途稍后再讨论。
由上两式可得:
设定微表面反射光线遵循菲涅尔定理,则反射通量:
由上两式可得反射辐射率:
由BRDF的定义可得:
这里需要特别强调几个夹角:
- 是入射光线与朝向为的微表面法线的夹角
- 是入射光线与宏观表面法线的夹角
- 是反射光线与宏观表面法线的夹角
回到反射方程:
它是对积分,而上式分母包含,可以通过找到的关系,把消掉。塞入并不会影响方程的合理性,因为是可以调整的,现在是一个有单位的量,单位为。
继续和关系的推导:

如上图,入射光线照射到一个微表面上,与微表面的单位上半球相交于点,与微表面相交于点,反射光线与单位上半球相交于点,反射光束立体角(图中是)等于光束与单位上半球相交区域面积,法线立体角(图中是)等于法线立体角与单位上半球相交区域面积,因此求等价于求。
连线与法线相交于点,则,由于与半径的比值等于,而面积为,与半径的平方成正比,所以
连线长度为1,长度为,所以
而
由以上几式可得
需要注意的是,上图中的实际上是微表面的半角,所以
因此
前面讲到过并非所有朝向为的微表面都能接受到光照(Shadowing),也并非所有反射光照都能到达观察者(Masking),考虑几何衰减因子G的影响,最终得出Cook-Torrance公式:
5.4 预计算技术
在第三章阐述PBR的Cook-Torrance原理和实现的时候,提及过很多预渲染技术,诸如:Cubemap、HDR环境光等。本章节主要是讲解这些预计算或预卷积的技术,为将耗时的部分提前渲染,以便减轻实时光照时的渲染消耗。
5.4.1 立方体图卷积(Cubemap convolution)
立方体图卷积是以离线的方式预先为场景的辐照度求解所有漫反射间接光照的积分。为了解决积分问题,必须对每个片元在半球内的所有可能方向对场景的辐射进行采样。
然而,代码实现上不可能在半球从每个可能的方向采样环境的照明,可能的方向数量在理论上是无限的。但可以通过采用有限数量的方向或样本来近似方向的数量,均匀间隔或从半球内随机取得,以获得相当精确的辐照度近似,从而有效地用离散的方法求解积分。
即便采用离散的近似方法,对于每个片元实时执行此操作仍然太昂贵,因为样本数量仍然需要非常大才能获得不错的结果,因此通常采用预计算解决实时的消耗问题。由于半球的朝向决定所需捕获辐照度的位置,可以预先计算每个可能的半球方向的辐照度,所有采样的半球环绕着所有传出的方向:
给定任意方向向量后,就可以预计算的辐照度图进行采样。为了确定小块表面的间接漫射(辐照)光的数量,可以从半球的整个辐照度中采样出围绕其表面法线的总辐照度。取得场景的辐照度的代码很简单:
为了生成辐照度图,需要将环境的光照卷积转换为立方体图。鉴于对于每个片段,表面的半球沿着法向量定向,对立方体图进行卷积等于计算沿着法线的半球内的每个方向的总平均辐射度。

3.3.1.2 从球体图到立方体图描述了如何从球体图转换成立方体贴图,这样就可以直接获取转换后的立方体贴图,以便在片段着色器中对其进行卷积,并使用朝向所有6个面部方向呈现的帧缓冲区将其计算结果放到新的立方体贴图中。由于已经描述了将球体图转换为立方体图,可以采用类似的方法和代码:
用
environmentMap从球体HDR环境图转换到HDR立方体图。卷积环境贴图有很多种方法,此处将为半球上的每个立方体贴图像素生成固定数量的样本方向向量围绕半球并平均结果。固定量的样本向量将均匀地分布在半球内部。注意,积分是连续函数,并且在给定固定量的样本向量的情况下离散地采样积分函数只是近似值。如果使用的样本向量越多,就越接近积分实际值,但同时预计算过程越慢。
围绕着立体角的反射方程的积分很难处理,所以用其等效的球面坐标和。

我们使用极面方位角在半球环之间采样,其角度范围是0和2π,并使用仰角θ,其角度范围是0和 ,这样可方便地对半球进行采样。采用球面角度后的反射公式:
用黎曼和的方法以及给定的、球面坐标采样数量,可将积分转换为以下离散版本:
当离散地对两个球面值进行采样时,仰角θ越高,面积越小,如上图所示。如果不对面积差进行处理,就会出现累积误差。为了弥补较小的区域,可以增加额外的sin值来缩放sinθ的权重。
给定每个片段调用的积分球面坐标对半球进行离散采样转换为以下代码:
通过指定一个固定的
sampleDelta值来遍历半球,减小或增加样本增量将分别增加或减少准确度。在两个
for循环内,采用球面坐标将它们转换为3D笛卡尔样本向量,将样本从切线空间转换为世界空间,并使用此样本向量直接对HDR环境贴图进行采样。循环的最后将每个样本结果添加到irradiance,并除以采样的总数,得到平均采样辐照度。请注意,缩放采样的颜色值是cos(theta),因为光线在较大的角度处较弱,并且sin(theta)是为了弥补较高仰角的半球区域中面积较小的样本区域。5.4.2 预过滤HDR环境图(Pre-filtering HDR environment map)
预过滤环境图与预卷积辐照图非常相似。不同之处在于,需要考虑粗糙度并在预过滤环境图的不同mip级别中按顺序地存储更粗糙的反射。
通过使用球面坐标生成均匀分布在半球Ω上的样本向量来对环境贴图进行复杂处理的方法,虽然这个方法适用于辐照度,但对于镜面反射效果较差。当涉及镜面反射时,基于表面的粗糙度,光在通过法线n附近的反射就越粗糙,范围越大:

光线反射后所有可能的出射光形成的形状被称为镜面波瓣。随着粗糙度的增加,镜面波瓣的大小增加; 并且镜面波瓣的形状在变化的入射光方向上变化。因此,镜面波瓣高度取决于材质。
当谈到微表面模型时,可以将镜面波瓣想象为给定一些入射光方向的微平面中间向量的反射方向。当看到的大多数光线最终反射在微平面中间矢量周围的镜面波瓣中,这样的方法生成的样本向量才是有意义的,这个处理过程就是重要性采样(Importance sampling)。
5.4.2.1 蒙特卡洛(Monte Carlo)积分和重要性采样(Importance sampling)
为了充分掌握重要性采样的重要性,需要先深入研究已知的数学方法:蒙特卡洛积分。
蒙特卡洛积分主要围绕着统计和概率理论的组合。它帮我们离散地解决了一个群体统计或重要性的问题,而不必考虑所有群体。
例如,假设想要计算一个国家所有公民的平均身高。为了得到结果,可以测量每个公民并平均他们的身高,这将提供确切的答案。但是,由于大多数国家人口众多,这不是一个现实的方法:需要花费太多的精力和时间。
另一种方法是选择一个小得多的完全随机(无偏差)的人口子集,测量他们的身高并平均结果。这个人口可能只有100人。虽然不如确切的答案准确,但也会得到一个相对接近真相的答案,它被称为大数定律(Law of large numbers)。这个方法是,如果测量一个较小数量的子集N,它从总人口中得到真正随机的样本,结果将与真实答案相对接近,并且随着样本数量N的增加而变得更接近实际结果。
蒙特卡罗积分建立在这个大数定律的基础上,并采用相同的方法来求解积分。从总人口和平均值中随机抽取的方式简单地生成样本值N,而不是为所有可能的(理论上无限的)样本值x求解积分。如N增加得到的结果更接近积分的确切答案:
为了解决积分,我们采取用N从人口a到b中随机抽样,将它们加在一起并除以样本总数以平均它们。该pdf 代表着概率密度函数(Probability density function),它表明特定样本在整个样本集上发生的概率。例如,人口高度的pdf看起来有点像这样:

从该图中可以看出,如果我们采用任意随机样本的人口,那么挑选高度为1.70的人的样本的可能性更高,而样本高度为1.50的概率较低。
当涉及蒙特卡罗积分时,一些样本可能比其他样本具有更高的生成概率。这就是为什么对于任何一般的蒙特卡罗估计,我们根据pdf将采样值除以采样概率。到目前为止,在估算积分的每个例子中,生成的样本是均匀的,具有完全相同的生成几率。到目前为止我们的估计是不偏不倚,这意味着,鉴于样本数量不断增加,我们最终将会收敛到积分的精确解。
但是,蒙特卡罗的一些样本是有偏倚的,意味着生成的样本不是完全随机的,而是聚焦于特定的值或方向。这些有偏倚的蒙特卡罗估计有一个更快的收敛速度,这意味着它们可以以更快的速度收敛到精确值。但是,由于此方法的偏向性质,它们可能永远不会收敛到精确值。这通常是可接受的平衡,特别是在计算机图形学中,因为只要结果在视觉上可接受,精确的解决方案就不太重要。正如我们很快就会看到重要性采样(使用偏置估计器)所生成的样本偏向于特定方向,在这种情况下,我们通过将每个样本乘以或除以其对应的pdf来达到这一点。
蒙特卡罗积分在计算机图形学中非常普遍,因为它是以离散和有效的方式近似连续积分的一种相当直观的方式:取任何面积或体积进行采样(如半球Ω),生成N区域/体积内的随机样本量和总和,并权衡每个样本对最终结果的权重。
蒙特卡洛积分是一个广泛的数学主题,这里不会深入研究具体细节,但会提到有多种方法可以生成随机样本。默认情况下,每个样本都是完全随机(伪随机)的,因为我们习惯了,但是通过利用半随机序列的某些属性,我们可以生成仍然是随机的但具有有趣属性的样本向量。例如,我们可以用低差异序列(Low-discrepancy sequences)对蒙特卡洛进行积分,以生成随机样本,且每个样本分布更均匀:

图左:完全伪随机序列生成的采用点;图右:低差异序列生成的采样点。可以看出右边的更均匀。
当使用低差异序列生成蒙特卡罗样本向量时,该过程称为准蒙特卡罗积分(Quasi-Monte Carlo integration)。准蒙特卡罗方法有更快的收敛速度,这使它们对性能繁重的应用程序感兴趣。
鉴于新获得的蒙特卡罗和准蒙特卡罗积分的知识,我们可以使用一个有趣的属性来实现更快的收敛速度,它就是重要性采样( Importance sampling)。当涉及光的镜面反射时,反射光向量被约束在镜面波瓣中,其尺寸由表面的粗糙度决定。看到镜面外的任何(准)随机生成的样本与镜面积分无关,将样本生成集中在镜面波瓣内是有意义的,代价是蒙特卡罗估计有偏差。
重要性采样是这样的:在一些区域内生成样本向量,该区域受到围绕微平面中间向量的粗糙度的约束。通过将准蒙特卡罗采样与低差异序列相结合并使用重要性采样偏置采样向量,可以获得高收敛率。因为以更快的速度到达解决方案,所以只需要更少的样本来达到足够的近似值。因此,该组合甚至允许图形应用程序实时解决镜面反射积分,尽管它仍然比预先计算结果慢得多。
5.4.2.2 低差异序列(Low-discrepancy sequence)
这里,将通过基于准蒙特卡罗方法的随机低差异序列,使用重要性采样预先计算间接反射方程的镜面反射部分。本小节使用的序列称为哈默斯利序列(Hammersley Sequence)。哈默斯利序列序列基于范德科皮特(Van Der Corpus)序列,它将以基数b表示的自然数列反转可得结果。
鉴于一些巧妙的技巧,我们可以非常有效地产生,我们将用它来获得一个序列哈默斯利样品着色器程序范德语料库序列,
N是总样本:GLSL代码
Hammersley函数给出了总样本集为N的低差异样本i。并非所有与OpenGL的驱动程序都支持位运算符(例如WebGL和OpenGL ES 2.0),在这种情况下,我们可能希望使用不依赖于位运算符的替代版Van Der Corpus Sequence:
请注意,由于旧硬件中的GLSL循环限制,序列会循环遍历
32位能表示的所有数。这个版本性能较差,但可以在所有硬件上运行。值得一提的是,生成低差异序列的方法还有很多:
详细请参看Low-discrepancy sequence。
5.4.2.3 GGX重要性采样(GGX Importance sampling)
我们将基于表面粗糙度生成偏向于微表面中间矢量的一般反射方向的样本矢量来取代统一或随机(蒙特卡罗)地在积分半球Ω上生成样本向量。采样过程将类似于之前的过程:开始一个大循环,生成一个随机(低差异)序列值,取序列值在切线空间中生成一个样本向量,转换到世界空间并采样场景的辐射。不同的是,我们现在使用低差异序列值作为输入来生成样本向量:
另外,为了构建样本向量,我们需要一些方法来定向和偏置原本朝向某些表面粗糙度的镜面波瓣的样本向量。我们可以按照章节[3.1.4 双向反射分布函数(BRDF)](#3.1.4 双向反射分布函数(BRDF))中的描述获取NDF ,并将GGX NDF结合在Epic Games所描述的那样球形采样向量:
这给了我们一个样本向量,它基于一些输入粗糙度和低差异序列值,并且在预期的微表面中间向量的周围。请注意,根据迪斯尼原则的PBR研究,Epic Games使用平方粗糙度来获得更好的视觉效果。
用低差异序列的Hammersley序列和样本生成为我们提供了最终确定预过滤卷积着色器:
根据输入的粗糙度预先过滤环境,这些粗糙度在预过滤器立方体贴图的每个mipmap级别(从
0.0到1.0)中变化,并将结果存储在prefilteredColor中。得到的预过滤颜色除以总样品权重,其中对最终结果影响较小的样品(对于小NdotL)对最终重量的权重较小。5.4.2.3 预过滤卷积瑕疵
虽然上述的预过滤图在大多数情况下都能正常,但总会遇到一些瑕疵。下面列出最常见的,包括如何解决它们。
- Cubemap高粗糙度的接缝
在具有粗糙表面的表面上对预滤镜图进行采样意味着在其一些较低的mip级别上对预滤镜图进行采样。对立方体贴图进行采样时,默认情况下,OpenGL不会在立方体贴图面上进行线性插值。由于较低的mip级别都具有较低的分辨率,并且预滤波器映射与较大的样本波瓣进行了卷积,因此立方体面之间的滤波的瑕疵变得非常明显:

幸运的是,OpenGL为我们提供了通过启用GL_TEXTURE_CUBE_MAP_SEAMLESS来正确过滤立方体贴图面的选项:
只需在应用程序启动时的某个位置启用此属性,接缝就会消失。
- 预过滤卷积中的亮点
由于镜面反射中的高频细节和剧烈变化的光强度,使镜面反射卷积需要大量样本以适当地解析HDR环境反射的广泛变化的性质。我们已经采集了大量样本,但在某些环境中,在某些较粗糙的mip级别上可能仍然不够,在这种情况下,将开始看到明亮区域周围出现点状图案:

一种选择是进一步增加样本数,但这对所有环境都还不足够。可以通过(在预过滤卷积期间)不直接对环境贴图进行采样来减少这种伪影,而是基于积分的PDF和粗糙度对环境贴图的mip级别进行采样:
不要忘记在环境贴图上启用三线性过滤,以便从以下位置对其mip级别进行采样:
然后让OpenGL 在设置立方体贴图的基本纹理后生成mipmap :
这种效果非常好,并且可以在粗糙表面上的预过滤图中删除大多数点。
5.4.3 预计算BRDF
在预过滤环境启动和运行的情况下,我们可以关注分裂和近似的第二部分:BRDF。让我们再次简要回顾一下镜面分裂和近似:
我们已经在不同粗糙度级别的预过滤图中预先计算了分裂和近似的左侧部分。右侧要求我们在角度上收集BRDF方程、表面粗糙度和菲涅耳的。这类似于将镜面BRDF与纯白环境或
1.0的恒定辐射进行积分。将BRDF压缩为3个变量有点多,但我们可以将移出镜面BRDF方程式:F是菲涅耳方程。将菲涅耳分母移动到BRDF给出了以下等效方程:
用Fresnel-Schlick近似法代替最右边的F可得到:
再进一步地,用α替换,将更容易解决:
然后拆分菲涅耳函数F成两个积分:
由于是常量,可以从积分号内移出。接下来,我们替换α回原来的形式,得到最终的BRDF方程:
两个得到的积分分别代表了的缩放和偏移。请注意,作为已包含一个F项,所以F项都从f$中删除了!
以类似于早期卷积环境图的方式,我们可以在其输入上卷积BRDF方程:n和之间的角度和粗糙度,并将卷积的结果存储在2D查找纹理(LUT)中。
BRDF卷积着色器在2D平面上运行,使用其2D纹理坐标直接作为BRDF卷积的输入(
NdotV和roughness)。卷积代码很大程度上类似于预过滤卷积,不同之处在于它现在根据我们的BRDF几何函数和Fresnel-Schlick的近似值处理样本向量:从上面可看到,BRDF卷积是从数学到代码的直接转换。采取角度θ和粗糙度作为输入,生成具有重要性采样的样本向量,在几何体上处理它并且导出BRDF的菲涅耳项,并输出对于每个样本的的缩放和偏移,最后将它们平均化。
当与IBL一起使用时,BRDF的几何项略有不同,亦即变量k的解释略有不同:
由于BRDF卷积是我们将使用的镜面IBL积分的一部分,所以用作为Schlick-GGX几何函数的参数:
分裂和积分卷积的BRDF部分渲染结果如下:

利用预滤环境图和BRDF 2D LUT,我们可以根据分裂和近似计算间接光照镜面部分的积分。然后,组合间接或环境镜面反射光,最终算出IBL光照结果。
5.5 PBR的优化
5.5.1 离线渲染优化
5.4 预计算技术章节提到了一些离线渲染的加速技术,除此之外,常见的离线技术还有:
- 局部静态光照烘焙
- 全局光照烘焙
还可以从以下小节中阐述的方法加速离线渲染部分。
5.5.1.1 积分公式优化
主要是利用5.1 微积分(Calculus)描述的性质和定理对渲染公式进行优化:
- 常量移出积分项外
- 增加等效积分项
- 分离积分项
- 利用近似法替代复杂项
具体例子可以参看5.4 预计算技术。
5.5.1.2 硬件集成
将渲染通用的逻辑集成硬件指令或内建接口,可以充分利用硬件的性能,从而为渲染加速。
例如,将光线追踪算法集成进GPU显卡,而nVidia新一代RTX20系显卡已经集成了光线追踪技术,使得渲染效率更上一层楼。Unreal Engine 4.22的版本也集成了这一特性。

5.5.1.3 并行渲染
通过多线程、多进程、多设备的架构分摊消耗的帧渲染,使得每帧的渲染时间大大降低。这种技术在实时渲染领域也逐渐被普及。
5.5.1.4 分布式渲染
不同于并行渲染的小规模架构,分布式渲染通常以图形工作站、集群式渲染簇等中大型硬件架构为依托,以满足电影级别的离线渲染加速需求。
下图是《A MultiAgent System for Physically based Rendering Optimization》提出的一种多代理的加速渲染架构:

5.5.2 实时渲染优化
5.5.2.1 光照模型优化
- GGX伦勃朗光照计算
- Schlick的近似法
- Smith几何遮蔽函数混合
- 迪斯尼原则的金属度线性插值
以上都是本文前面章节描述过的加速算法,这对于性能敏感的实时渲染领域是非常有必要的。
5.5.2.2 资源优化
- 若干贴图合成一张蒙板图。将若干独立的PBR属性蒙板贴图合成一张:

使用同一张蒙板贴图同时控制PBR的颜色、金属度、粗糙度等属性。
- 减少PBR标准参数的使用。例如,金属材质的漫反射大部分是黑色,所以无需额外的漫反射贴图。
- 其它资源优化:材质、模型、渲染参数、纹理、PBR参数等等几乎都有优化的余地。
5.5.2.3 其它实时优化
实时渲染领域还有很多优化方法值得尝试和应用,比如:
- 《Moving Frostbite to PBR》提出的IES光照模拟。


5.5.3 移动端优化
由于移动设备普遍的性能与PC机有一定的差距,所以要将PBR应用到移动端,性能优化的需求更加迫切。
上一小节提到的实时渲染优化同样适用于移动端,此外,还可针对移动端做一些特殊的优化:
- 简化光照模型。采用更少的样本采样数量,更简化的光照计算公式。
- 简化shader。通过少量的shader指令或简化的数学运算可达到优化的目的。
- 启用引擎Mobile版本的资源和设置。Unity和Unreal Engine都提供了移动版本的材质库和特殊的配置,在无特别需求下,尽量使用它们。
- 分级策略。针对不同分级的设备启用不同复杂度的材质和资源,可以有效解决高中低画质的兼容问题。
更多请参看《Optimizing PBR》,还可参看另外一篇技术文章:《移动游戏性能优化通用技法》
5.6 PBR的未来
当今阶段,由于硬件、技术、理论等种种原因的限制,PBR技术在很多时候只能是采取近似模拟的方法,特别是在实时渲染领域,甚至在很多中低端PC或移动端设备还无法运行PBR技术。
但是,这不妨碍我们想象PBR技术未来的趋势和前景。
5.6.1 基于纳米级别原理
目前大多数PBR都是基于微平面(microfacet)的光照模型,micro即微米(),并且将反射模型简化成了几何光学,忽略了衍射、干扰、色散、光谱能量分布等等精确物理模型。
近两年,有人提出了基于纳米(nano,)级别的光照模型,可以先看看它和微米级别的区别:
微米几何(Microgeometry) | 纳米几何(Nanogeometry) |
波瓣形状取决于表面统计(微米级别的NDF) | 波瓣形状取决于表面统计(纳米级别的光谱能量分布) |
忽略光波波长 | 强依赖于光波波长 |
入射角通过可见性概率影响表面 | 入射角通过透视收缩(foreshortening)概率影响表面 |
也就是说纳米级别理论引入了SPD、光波波长,先进的表面统计,使得光照渲染更加物理正确真实了。

纳米几何将引入光波长、SPD等,会考虑光的衍射、干扰、色散等现象,显得更加物理真实。
当然,这种技术目前只能用于电影级别的离线渲染,未来还有很长一段时间才能进入实时渲染领域的视野。
5.6.2 更精确的光照模型
当前的PBR光照模型,包括Cook-Torrance及BSSRDF,大多是基于一维的曲线拟合。

从上图可以看出,由于是一维曲线,所以它们都是从中心向周边散开的圆形形状,只是圆的过渡稍有不同。
若是引入考虑光波波长的纳米级别的SPD(光谱能量分布),则可以引入更加复杂的二维光照模型曲线图:

上图可以看出,光的分布曲线不再是圆形形状,而是变成复杂的类似棉花絮状的二维图。这种才是更接近真实世界的光照曲线拟合。
虽然目前这种技术开销非常昂贵,但相信未来不久,这种技术会逐渐成为主流。
5.6.3 离线技术实时化
5.4 预计算技术中提到了很多预渲染、预卷积技术,这些都是为了减轻实时渲染的负担。而且实时渲染部分采用大量近似、简化的手段,使得光照不那么物理正确和真实。
未来若干年,离线渲染技术将会逐渐引入到实时渲染领域,使得实时渲染能够获得更加真实的渲染效果。
这里所指的离线技术包括但不限于:光照追踪、路径追踪、全局光照、环境光、局部静态光、烘焙光。
若是能将这些技术引入到实时渲染领域,那将是振奋人心的。近期发布的Unreal Engine 4.22的版本已经支持实时光线追踪技术:

短片《Troll》展现虚幻引擎4.22的全新光线追踪功能,能够实时渲染电影级别的画质。
相信这只是开始,未来离线技术实时化的步伐将会越来越快。
5.6.4 新兴理论和技术
近年来图形学的技术蓬勃发展,围绕着PBR为中心的新兴技术和理论百花齐放,相信未来也是如此,而且新的理论和技术会成倍加速发展。
这些新兴技术涵盖了基础物理学、光学原理、数学模型、算法和数据结构、计算机语言、渲染技术、图形API、GPU架构等等软件和硬件领域。
5.6.5 更多应用领域
未来随着基础理论、软件和硬件的发展,PBR的发展迅猛,将会得到更广泛地应用。横向维度将涵盖各行各业,纵向维度覆盖高中端层次的设备。
例如,沉浸式4D影院,虚拟与现实混合的游戏和教学互动(下图),投影真实人像的幻影会议,电影画质的移动端游戏,甚至是电影画质的街机游戏。

虽然目前看还有一段差距,但相信在不久的未来,借助PBR技术,这些预言将或多或少地呈现在大家面前。
总之,PBR技术在未来的发展和前景非常值得期待。