103119z54ngzg4s1ua488b.jpg
文/秦春林知乎专栏:全局光照技术

《全局光照技术:从离线到实时渲染》是一本聚焦于渲染领域的计算机图形学图书,它同时包含了离线和实时渲染的内容,探讨了渲染中最常用的约十种全局光照技术的概念,原理以及相互之间的联系,并以这些全局光照技术为线索介绍了大量计算机图形学相关的基础知识,全书约1000页左右的篇幅,是国内该领域较少的专著之一。

 

 



《全局光照技术》的众筹过10万了,按照约定我将赠送每名众筹支持者一份学习路线图以及总结我的一些学习方法,而学习路线图的其中一项内容就是介绍图形学中的一些数学知识,所以这里先简要做个概述。

很显然,数学是理解3D渲染算法的重要基础,那么这是不是意味着你需要重新去复习整个大学工科数学的知识呢?实际上作为工程师,我们的目标只是要理解工业技术(而非背后的数学知识)的原理,这本也是工程技术和理论研究的区别。一门数学学科本身是需要去解决更一般的问题的,然而对于理解一种工程技术,如果你不需要去设计和改进算法本身,你往往只需要了解它的(可能是非常简化的)一部分或者说理解它的意义即可,当你对整个工程技术的架构比较熟悉之后,你可以从某个方面深入去学习,定制和甚至改进。

以下我从渲染方面做一些简要分析以及归类,列出一些大概需要掌握的相对比较重要的数学知识,并对每种知识做一个简要概述,以及说明每个知识点用于解决渲染中什么样的问题。

蒙特卡洛方法

蒙特卡洛方法是整个离线渲染最核心的基础,由于渲染方程是一个(理论上无限)高维积分,所以它不可能通过分析的方法求解。你需要深刻明白对一个概率密度函数进行抽样,并用所得样本来求解一个积分值的概念,我们称作对积分的一个估计,不仅仅是渲染方程,渲染中的很多积分计算可能都需要使用蒙特卡洛方法进行计算;在这个过程中由于随机数本身的方差属性,因此估计值也具有方差,减少估计的方差是渲染当中的核心内容,你需要明白每个样本参与估计的“贡献值”的概念,贡献值越小的样本越容易产生较大的方差,使每个样本的贡献值尽可能大,这个概率密度函数与被积函数需要尽可能的相似,这又称为重要性采样;然而我们很难找到与被积函数相似的概率密度函数,但是很容易找到与被积函数的部分相似的概率密度函数,因此我们希望将多个重要性采样组合起来,这就是复合重要性采样,你要明白复合重要性采样的核心是使来自每个重要性采样的样本的贡献值尽可能相似。除了数学层面,你还需要理解双向路径采样中顶点连接涉及的一个重要方面,那就是顶点连接不是一个随机的过程,因此这个它使得连接起来的路径具有独一无二的组合概率密度函数,因此对于同一长度的路径,在不同位置处进行连接是一种不同的采样技术,因此当你产生一条完整路径之后,实际上你(通过在不同位置处连接两条子路径)产生了多个采样的结果,然后你使用复合重要性采样对所有这些采样技术进行组合。

傅里叶分析

傅里叶分析可能是仅次于蒙特卡洛方法的数学工具,它广泛运用于过滤,平滑,以及数据压缩等方面,它也是小波分析和球谐函数的重要基础。如同一系列正交的坐标轴(如(0,0,1), (0,1,0), (1,0,0))构成一个矢量空间,然后该空间中的任何矢量都是这组正交基矢量的线性组合一样,如果一系列的函数是相互正交的(即它们每两个函数的乘积的积分值均为0,除非两个函数相同,此时积分值为1),则这些函数构成一个函数空间,因此该函数空间的任意一个函数都可以表述为这些基函数的线性组合,傅里叶变换使用的正余弦函数正是这样的一组无限个数量的基函数,因此这就是为什么任意函数都可以进行傅里叶变换,傅里叶变换的本质就是将一个函数转换为所有这些无限个正余弦函数的线性组合,这些线性组合的系数是由一个称为投影的方法计算的,该方法的算法就是通过求原始信号函数与某个基函数乘积的积分值,理论上我们记住这无数个线性组合的系数就可以重合合成为原始的信号函数,这个过程称为重建。所有这些投影形成的系数形成一个连续的函数,它反映的是原始信号函数的频率分布,如果你去掉该频率分布中的某些区间,你就丢掉了原始信号对应的频率部分,通常对于一个方差比较大的采样结果,我们可以丢弃掉频率高的部分,它们通常都是导致方差较大的罪魁祸首,因此函数的高频部分需要更多的样本,而由于计算资源限制我们通常都无法满足这样的条件。你会发现一个在频率域对频率分布进行带限的函数,在原始的时间域或空间域变成了一个平滑函数,这也是通过对这个带限函数本身进行傅里叶逆变换得到的,这就是过滤的思想。你还会发现在频率域计算两个函数的乘积变成了时间域或空间域对一个数组(例如所有像素组成的一个图像)元素中的每个元素都执行一次过滤计算,这就是卷积的概念。

小波分析

函数空间的投影和重建的概念也是小波分析的基础,小波函数是一类特殊的正交基函数,即低频率的基函数构成的函数空间是高频率基函数构成的函数空间的一个子集,这就使得高频部分的基函数系数可以表述为与低频部分基函数系数的差值,这种特性使得小波变换形成了一个多分辨率的结构,你可以想象对于多级纹理(mipmap),低分辨率的图像是高分辨率图像中相邻元素平滑过滤得到的,例如对于较远的表面,使用低分辨率的纹理就可以得到很好的近似,这种结构特性被天然使用到辐射度方法中,你会发现原来我们不需要对每两个细分曲面进行光照传输的计算,因为有些较远或者立体角较小的范围,这部分可以使用低分辨率的曲面细分网格结构,这称为阶层式曲面细分方法。

球谐函数

函数空间的投影和重建也是所谓球谐函数的基础,球谐函数本质上就是将傅里叶变换使用的单位圆上的正余弦函数扩展到单位球面上,这些基函数实际上就是将三维空间的勒让德多项式进过缩放是之恰好位于球面上,由于单位球面坐标上的长度固定为1,因此球面坐标系退化为一个二维的单位球面坐标系,其两个坐标值构成一个空间的方向,因此球谐函数的线性组合可以用来表述一个与位置无关的方向函数,而方向函数在渲染中太普遍了,例如环境贴图就是一个与位置无关的方向函数,表面的反射方程也是一个方向函数,它根据一个入射方向分布计算出一个出射方向分布,因此球谐函数可以用来表述光照传输函数和环境贴图光源,同样去掉高频的部分,使用少量的系数就可以近似一个方向函数的低频部分,这就是预计算辐射度方法的数学基础,此外球谐函数的一些特性,如旋转不变性,卷积,内积等,这些也是辐射照度缓存算法的基础。

几何光学

除了光滑平面上的反射/折射定理,光学部分最重要的内容是关于微观表面的光照传输。在数字场景表述中,我们可以使用纹理贴图来表述一个表面的属性,例如BRDF双向反射函数,折射率等,然而要知道实际物体的微观表面结构的尺寸是非常小的,它甚至比一个像素的尺寸还要小得多,这个时候用贴图是没有办法描述的。然而我们可以使用一个像素的表面“展开”成一个分布函数,注意,原始纹理像素表述中,每个像素只产生一个确定的值,入射对于一个固定的入射方向,始终会反射到一个固定的出射方向,但是现在对于一个像素,相同的入射方向可以根据概率被反射到不同的出射方向,其中每一个不同的交互结果模拟了一个微观粒子(可理解为一个微观平面)的行为,这就使得光照传输可以在像素级别处理微观粒子结构的交互,这就是著名的微面元理论,不同的微面元的方法就是建立不同的分布函数模型,它们主要是建立一个这些微观粒子的法线分布,同时还有建立这些粒子形成的不平整曲面见的遮挡等关系,最终将菲涅尔函数融入到分布函数中,形成了最终的微面元双向分布函数。

梅特波利斯算法

如果采样使用的概率密度函数与被积函数不相似,那么样本的贡献值就不是一个常数,这意味着某些样本更重要或者更不重要,这就是使得估计的方差比较大,我们需要调整概率密度函数。如果采样使用的概率密度函数完全正比于被积函数,则样本的贡献值为一个常数,估计的方差为0,并且这意味着每个样本的计算都不需要计算贡献值,我们只需要数每个区间样本的数量就可以得出被积函数(即最终图像)的分布。梅特波利斯算法正是通过一种取舍的机制使得采样的概率密度函数正比于被积函数。其原理来源于马尔可夫链,马尔可夫链是一种在稳定状态下,系统之间各个状态之间转移概率的分布,梅特波利斯算法将整个被积函数的分布当做一个马尔可夫链,然后通过定义一个状态之间的转移概率分布使整个状态之间的分布相似于被积函数。由于梅特波利斯算法能够产生完全相似于被积函数的样本,因此可以很轻易地找到一些特别困难的路径,是离线渲染当中一种非常重要的采样方法。

模拟退火/总体蒙特卡洛方法

传统的梅特波利斯算法并没有说明样本的产生方法,在光线追踪中一般是使用传统的如双向路径追踪来产生一个样本路径,然而对于同一路径,双向路径追踪可以使用多种采样技术采样而得,得到一条贡献值较大的路径的概率取决于其使用的采样技术,在原始的MLT或PSSMLT算法中,每种采样路径是随机选择的,然而除了可以对路径的几何信息(如位置)进行突变外,采样技术之间也是可以突变的,因为对于一些特定的几何场景,一些采样技术会优于另一些采样技术。在蒙特卡洛方法中,有一类方法可以将原始的单个马尔可夫链按照某种度量进行区分,注意这种区分并不是空间上的划分,而是每种区分本身都是一个独立的马尔可夫链,只是遵循不同的转移概率分布,这种方法称为总体蒙特卡洛方法,其中一个具体算法是所谓模拟退火的思路,想象一下一个物体由高温逐渐冷却的过程,在其中的每一个温度下,粒子之间都是出于一种平衡状态的,然而在不同温度下物质之间的转移概率分布是不一样的,这种思路使我们可以通过寻找一种影响状态转移的因素,并将该因素对应的状态转移定义为一个子平衡系统,通过在这些子系统之间跳跃,我们可以寻找到最快的遍历全部状态的方式。显然路径的不同的采样技术就是一个这样的因素,每种采样技术都可以产生一个独立的平衡系统,但是对于某些路径,另一些采样技术可能是更有效的,通过在路径之间的跳跃,我们可以寻找最快收敛的方法。这些思路在近几年的MMLT和RJMCMC算法中有着重要运用(参见:https://zhuanlan.zhihu.com/p/28345852)。

微分几何/流形

传统的路径的采样都是完全随机的,例如无论是基于蒙特卡洛方法的单/双向路径追踪,还是基于马尔可夫链蒙特卡洛方法的梅特波利斯光照传输等,本质上都是使用ray tracing的方式从每个顶点的BRDF函数对方向进行随机采样以形成一条路径,这些方法都是基于对场景的几何信息是未知的。如果我们能够结合场景的几何信息,那么能否更有效地产生一条路径呢?这就是近几年非常重要的流形探索算法的核心思路。流形是指一个用一个隐函数描述的几何体,它是欧几里得空间的一个部分,它的整个几何体是通过局部的关系描述的,而不是像欧几里得空间其用全局的位置等信息描述,这种局部特征使得我们可以很好地探索场景的几何信息。由于反射定理和折射定理也是基于局部的定理,结合这些局部几何信息(往往是指能够获得几何体局部位置的变化,如导数等),我们可以得出光照传输的局部微分信息,而根据牛顿方法,如果已知几何体各个位置处的微分信息,则我们可以通过一系列连续迭代的过程寻找到一个给定函数的根的近似值,这用在流形中即是我们能够通过确定性的方法“找出”一条相似路径,这就是流形探索的核心思路,它用于梅特波利斯算法中高效地寻找相似路径。


有限元方法

如果光照的分布函数具有较低的频率,例如对于由漫反射表面构成的场景,我们可以将被积函数进行比较低分辨率的划分,然后对每个较大的区间使用一个值进行近似,这种方法就是有限元方法,在渲染中称为辐射度方法,在该方法中,场景被划分为一些曲面片,然后通过预计算出这些曲面片之间近似的光照传输,以形成一个传输矩阵,那么对于任意给定光照,我们便可以通过该矩阵的线性变换计算这些光照的传输结果。

迭代法

在辐射度方法中,我们通过预计算得到一个光照传输矩阵,它可以将任意一个给定的光源分布进行线性变换得到最终的光照结果。对于线性方程组的求解,数学上常用的方法是高斯消元法,它们通过对方程组的系数构成的矩阵执行一系列行交换操作将其转换为一个上三角矩阵(upper triangular matrix)进行求解。然而这样精确求解的方法在数字计算机中运用时却会遭遇被称为取整误差带来的问题。 在数字计算中,一个实数被保存为浮点数的形式 ,计算机中存储尾数的数字位是有限的,如果有 n 个数字位供存储,那么超 出 n 的部分则按四舍五入法进行取整,取整后被存储进计算机的值称为存储值, 上述的高斯消元法是由一系列操作组成的,对于每一次操作计算,它都需要将结果写回到内存中供后续的计算使用,每次存储都可能出现这种取整误差,随着整个消元法的进行,这些误差被传播并累计下去,导致最终结果出现比较大的误差,辐射度方法中矩阵的维度更是可能上万,这种误差是不可能忽略的。 高斯消元法计算的是一个直接的结果,它没有提供一种修正的机制,对于这样的误差,我们希望能够有一种修正的机制用于通过一个迭代过程将误差逼近至某个可接受的范围。所以在计算机中,我们通常使用迭代法来求解线性方程组,例如前面介绍的牛顿迭代法,它每次计算的可能不是一个直接准确的结 果,但是它提供一种机制使可以逐渐收敛到正确结果,在这个收敛过程中,我们就有机会将最终结果限定在一个可接受的误差范围。 常见的迭代法如雅可比方法,高斯-赛德尔方法等。此外,你还可以对传输矩阵执行分解以得出一个全局的传输操作符。

概率密度估计

在回归分析中,对于给定的一些数据抽样值,我们可以根据这些样本拟合出一个真实函数出来,例如核估计通过对周围一定邻域范围内的样本求加权平均来计算某个位置的真实值,与此类似,核密度估计方法则是要根据一些(往往具有相同值)的样本拟合出一个概率密度函数,因此我们可以首先将光子根据光照传输随机分布到场景表面上形成一个光子图,然后通过对这些光子执行概率密度估计来计算出它的光照分布,然后再从摄像机收集这些光照来计算最终看到的图像的分布,这就是光子映射的基本思路。和回归的思路类似,概率密度估计通过对周围的样本进行平滑来拟合概率密度分布,这个平滑的过程导致了偏差,但是却减小了估计方差,更重要的是,将一条路径的顶点与该顶点附近的光子进行“合并”以产生一条全路径,这相比于前面介绍的双向路径追踪的顶点“连接”,它大大提升了漫反射顶点与光泽路径的连接效率,使得其成为渲染如焦散效果的最有效的方法,如今,基于概率密度估计的光子映射方法也几乎是离线渲染器的标配。

【上述以及更多渲染相关数学知识以后在本专栏会以系列的形式更详细介绍】

上述所有这些数学方法都会在《全局光照技术》中详细讨论,并且是以比较容易理解的方式讨论,我的目标是甚至不需要你专门去查询和复习相关数学概念,就可以理解它们的基本意义以及在渲染中的运用。

 

 



关于《全局光照技术》

103120gr646do4wlic06jk.jpg
103140n14s6654fffperyr.jpg
涵盖大量的数学知识

很显然图形学涉及到非常多的数学知识,这是一般初学者感到最头疼的地方,一方面这些数学知识对理解渲染概念及方法是必须的,另一方面很多工程师不愿意去花很多时间复习这些繁琐的数学基础知识。

鉴于此,《全局光照技术》作出了两点尝试,首先,它还是涵盖了大多数重要且必须了解的数学知识,如微积分,数值分析,蒙特卡洛方法,梅特波利斯算法,概率统计,线性代数,傅里叶/小波分析,微分几何/流形,几何光学,数字信号分析,回归分析,频率域分析,有限元方法,模拟回火,迭代法等等;其次,在讨论这些数学知识的时候,它将这些数学知识的复杂推理过程去掉,并用比较简洁的语言讲述这些数学知识的意义,使读者既能够理解该数学知识作为工具的原理,又能更深刻地理解这些图形学方法的机制。如果您阅读过 冈萨雷斯 (Gonzalez.R.C.)的《数字图像处理》,本书的数学知识介绍风格正是受此书的影响(该书也是我最喜欢的图书之一),它使用比较简洁精炼的方式介绍相关的数学工具,使您几乎不需要去进一步阅读更专业的数学专著就可以理解这些方法背后的数学原理。

此外,很多同类图书喜欢将数学知识单独全部拿出来放在前面的几章或者附录中作为基础知识,我认为这种方法不利于高效地学习。首先,人的记忆力是有时间限制的,越长时间的记忆越容易忘记或变得模糊,读者在读到后面具体运用时往往已经对前面的数学基础知识有点模糊了,并且对于工程师而言,我们核心是运用,只有将数学知识放在具体运用中去介绍才会更好地理解相关概念。所以,《全局光照技术》总是将这些数学知识分散到具体运用的地方去,在阅读《全局光照技术》时,只有当我们需要了解某个数学知识时,我才会开始去介绍它,而一旦介绍了某个数学知识,马上就能看到它怎样被运用,这种风格也在《数字图像处理》中被体现。

覆盖最前沿的渲染技术

不像PBRT聚焦于比较经典的路径追踪算法实现,《全局光照技术》覆盖了截止2017年大量的行业中最前沿的渲染技术,例如VCM/UPS,降噪技术,频率域分析,微分流形/几何,梯度域渲染,基于光束的参与媒介渲染技术等等,这些都是近几年离线渲染领域最前沿的方向和技术,被广泛运用于最近皮克斯,迪士尼等动画电影当中,使读者能够了解到最前沿的行业动态和趋势。

同时包含离线和实时渲染的内容

大多数关于计算机图形学的书籍,都是专门针对实时或者离线渲染领域,例如《Real-Time Rendering》针对实时渲染,而 《Physically Based Rendering: From the Theory to Implementation》聚焦于离线渲染。而客观的事实是,实时和离线渲染同属于计算机图形学领域, 它们只是在当前硬件水平下针对实时性需求的划分,因此,不仅作为渲染工程师我们需要同时掌握实时和离线渲染,另一个事实是,实时渲染中的静态光照贴图等概念,一些预处理数据等都是需要借助于离线渲染来实现的;此外,很多实时的全局光照模型都是从离线渲染模型优化,改进而来,学习离线渲染对实时渲染中概念理解有极大的帮助。因此为了让读者更系统地学习渲染知识,本书是同类图书中较少的同时包含离线和实时渲染内容的图书。

覆盖主流的全局光照技术

在内容架构上,《全局光照技术》主要是按照各种全局光照技术为主线进行组织的,本书基本上覆盖了当前行业中最重要的约十种全局光照技术,例如针对离线渲染领域的路径追踪,梅特波利斯光照传输,光子映射,针对交互式需求的辐射度方法,即时辐射度,以及针对实时需求的预计算辐射传输,辐射照度缓存,光照传播体,基于体素的全局光照技术以及基于距离场的全局光照技术。这些各种独立的全局光照技术及其涉及的知识覆盖了渲染领域大部分的内容,能够帮助读者建立更加全面的计算机图形学知识体系。

知识之间的逻辑联系分析非常多

这些各种不同的全局光照解决方案彼此之间并不是完全独立的,它们有着极强的关联,你能够从一种解决方案中看到另一种方案的不足,一种解决方案可能是另一种解决方案的改进和优化。例如 Path Tracing是与摄像机视角相关的,因此改变视角则需要重新计算,而Radiosity则与摄像机视角无关,因此它可以将数据预处理,并且能够实现渐进式计算(即将复杂的计算分布于多帧中,每帧计算一个增量并累加至一个精度更高的结果);为了加速光线追踪计算,与Path tracing直接从物体复杂的几何表述中获取光照信息不同,Photon mapping方法则将光照信息存储为一个独立的数据结构(称为 Photon map)这大大加速了光线追踪的计算。我们可以看到,这些不同的全局光照模型之间的联系本身也能促进我们更透彻地理解这些概念。

官网及购买地址:http://www.thegibook.com/


锐亚教育

锐亚教育,游戏开发论坛|游戏制作人|游戏策划|游戏开发|独立游戏|游戏产业|游戏研发|游戏运营| unity|unity3d|unity3d官网|unity3d 教程|金融帝国3|8k8k8k|mcafee8.5i|游戏蛮牛|蛮牛 unity|蛮牛