分类目录归档:Book

渲染中的数学知识

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

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

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

蒙特卡洛方法

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

傅里叶分析

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

小波分析

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

球谐函数

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

几何光学

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

梅特波利斯算法

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

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

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

微分几何/流形

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

有限元方法

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

迭代法

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

概率密度估计

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

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

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

《全局光照技术》正在摩点网众筹预购,该书历时三年创作,为了更好的理解这些数学概念及思路,以便为了更好的学习图形学,建议您够买一本《全局光照技术》,这也是对我写作的一种鼓励和支持,感谢!

来自在校学生的心声!

在一个人一生的成长过程中,在年少时期,或者还未进入社会的时期,或者还没意识到某些知识重要性的时期,能够有机会获得一本优秀的图书,对一个人一生的影响是巨大的!
 
对于我来讲,我在初中的时候一个偶然的机会有幸在一个出租小说的书店里一眼扫到了角落里一本培根的《人生论随笔》,在那个同学们都在阅读古龙,金庸武侠江湖的时代,我走进了培根的世界,那些对人生的智慧而朴实的描述,奠定了我现在整个人的为人性格,学习,做事,感知这个世界等各方面的基础,我整个一生都在庆幸我在年少时期遇到了那本书,那个时候我还不懂得也未曾思考过许多关于人生的事情,我时常感叹如果没有那本书,我的人生一定会完全不一样,也不会有现在这本《全局光照技术》。所以直到今天,我认为教育一个孩子最重要的就是要在他/她年少时期选择一些非常优秀的图书,最重要的教育其实是自我教育,不管哪个时期都一样,所谓“自学”不仅仅是成年人的专项。
 
我相信,对于一名还未真正走进计算机图形学工业实践之前,《全局光照技术》之于一名在校学生,其亦可能具有培根的《人生论随便》之于我性格的功效!于是考虑到在校学生的经济条件有限,《全局光照技术》在开始预订之前就提供了一个给在校学生和研究者提供教育特惠的申请通道,任何在校学生都可以凭相关资格获得一张七折优惠券。
 
自开通以来,目前已经累计收到103名在校学生的申请,分别来自75所高等院校,其中2名高中生,60名专/本科生,36名硕士研究生,5名博士研究生。
 
然而,令我很意外的是,《全局光照技术》这本图书的读者群体能够覆盖从高中生到博士研究生的范围,这是一个很令人惊讶的结果,一本书由于写作风格以及知识结构的原因,通常它都是针对一个特定的人群,例如本书在写作时的假想读者一直都是工业运用中的工程师和技术美术,但事实上它收到了更加广泛领域的关注,并且这些关注不仅仅是一种想学知识的渴望,而是他/她们通过阅读试读内容之后得到一种对自己有帮助的结论和体会。
 
以下列举一些申请教育特惠学生的心声(从高中到博士研究生的顺序,出于隐私考虑这里不提供学生姓名):
 
“我是一名高三的学生,我从高一开始学习编程,高二开始研究计算机图形学。我对现阶段前沿的渲染技术很感兴趣,但可惜的是例如辐照度,IBL,LPV等等前沿的图形技术只有英文文献可以查阅。我在摩点网上发现了您的著作《全局光照技术》。从试读章节我就能感觉出这本书很适合我,可惜校学生特惠申请只向高校学生开通。不知我能否作为一个高三学生获得一个在校学生优惠的名额呢?”
— 来自湖南XXXX中学一名高中学生
 
“我在美国高中念书,我的专攻是深度学习和利用深度学习进行降噪。因为我没有教育局ID,所以我用学校edu邮箱发了一个email. 我看了Gi Book英语版的初稿,感觉质量非常高。 我想问一下我可否申请一个优惠价格呢?”
— 来自一名在美国念高中的学生
 
“作为一名学生,我很希望能够有幸获得这本书来提升我在计算机图形学领域的专业知识。”
— 长春工业大学一名本科学生
 
“真的非常感谢您,对于一位美术设计专业的学生,这本书真的太重要了。”
山东青年政治学院一名本科学生
 
“感谢您即将出版的《全局光照技术》,感谢您的慷慨~”
— 电子科技大学一名本科学生
 
“关注您所编写的书籍很长时间了,希望能够尽早读到您的大作,非常期待~”
— 哈尔滨理工大学一名本科学生
 
“我对计算机图形学,特别是渲染方面有着浓厚的兴趣,也一直在课外时间进行学习。我在今年7月的时候看到您的著作,并且下载了试读版本进行学习。您的这本《全局光照技术》可以说是我目前读过的渲染方面的中文书籍中最详细和全面的一本,使我受益匪浅,并一直期待全书完成的时候在第一时间购入学习。”
— 北京师范大学一名研究生
 
“期待您完整版的新书!感谢您为我解开了很多困惑!”
— 湖南大学一名硕士研究生
 
“一个偶然的机会了解到了这本书,阅读了试读版后,惊艳到了,我当即下定决心购买一本。再次感谢你们为图形学做出的贡献!“
— 中国科学院大学一名研究生
 
“试读版本给我很大的震撼,行文逻辑非常适合入门,很能把握读者的思维方式。读罢,很是期待其它未完成章节。共勉! ”
东南大学一名硕士研究生
 
“在读硕博连读研究生,之前阅读了试读版,一直等待正式版发行!”
— 云南大学一名博士研究生
 
看到这些来信其实很感动,人一生的意义其实是要做一些对他人有帮助的事情,这也是我一开始写作这本书就报有的信念,那些怀疑我写作动机的人,我可以告诉你,带着一种完全的功利心绝不可能达到这本书目前的质量,也定然不可能收到上述这种众多期待!
 
于此,还是再次希望各位朋友能够将这本书多推荐给您身边的朋友,同事和同学,中国图形学社区的繁荣需要整个产业人才的平均水平能够提升起来,让我们共同期望这本书能够在这个方面发挥一点作用。
 
如果您是在校学生并期望购买《全局光照技术》图书,您可以申请一张七折优惠券,然后至摩点网参与众筹预定。
 
 
感谢大家的支持!
 
秦春林
2017.12.4

UE4新书推荐:《大象无形:虚幻引擎程序设计浅析》

今天给大家推荐一本Unreal Engine 4的新书:《大象无形:虚幻引擎程序设计浅析》。

这本书主要是从编程的角度讨论虚幻引擎的使用,分为三个部分,其中第一部分讲用ue4的C++做游戏,第二部分讲ue4本身的一些核心机制(底层、反射、渲染系统、蓝图虚拟机)的源码实现,第三部分讲解插件开发和扩展虚幻引擎的一些方法。我们QQ群内的很多朋友都阅读过该书的样本,从我的角度,我觉得两位作者还是很用心的,没有去大段引述官方文档之类的,而是从自己理解的角度去系统地描述了虚幻引擎关于编程方面的基础知识及其关键点,是一本很好的基础读物,还是值得一阅的。

本书目前开始接受预定,预计5月可以发货,请感兴趣的朋友多多支持。

预定地址:http://product.china-pub.com/5591590

THEGIBOOK在摩点网发起众筹[已结束]

《全局光照技术:从离线到实时渲染》于2017年3月21日开始在摩点网发起众筹,在这次众筹期间读者可以购买前半本书(约400页)的纸质书稿,以及作者在准备期间总结的一本约300页的包含全书内容的英文草稿,参与众筹的每位读者将额外赠送新书折扣卷,它可以用于新书正式出版后早于任何渠道以7折购买成书。

本次众筹的目的是为了扩大试读范围,以使能够在写作阶段获取更多的反馈来帮助提高最终成书的质量。这次众筹参与者将能得到:

  • A. 列入本站专门的众筹感谢名单页面
  • B. 本书1-6章约400页的纸质书稿
  • C. 本书写作期间总结的关于书中所有全局光照技术的约300页的英文草稿书一本
  • D. 一张7折优惠券用于发布时早于任何渠道在本站以7折购书

多谢大家的支持!
众筹项目地址:http://t.cn/RiBogFq
众筹结束时间:2017年5月1日

感谢Epic Games授权将《A Boy and His Kite》动画短片画面用作THEGIBOOK封面图片!

亲爱的读者朋友们:

我们很高兴地向您宣布:Epic Games已经正式授权将《A Boy and His Kite》动画短片中的画面用作《全局光照技术:从离线到实时渲染》的封面图片!

《A Boy and His Kite》是一部使用Unreal Engine 4制作的实时动画短片,它凭借Unreal Engine 4优秀的渲染技术获得SIGGRAPH 2015 最佳实时图形与交互奖项(BEST REAL-TIME GRAPHICS AND INTERACTIVITY AWARD),如果您还没有欣赏过这部短片,可以从这里获得更多相关信息。

本书选择这张图片作为封面有两个原因:其一是它反映当代优秀的实时图形渲染技术;其二,更主要的是我想透过这张图片传递一个寓意。这个短片展示了一个小男孩非常喜欢他的风筝,在大自然中自由地追随它,在一个无限的世界里畅游。与此相似,在这本书中除了知识以外,我也想传递一种对知识的追求精神,现在很多人看书存在很大功利心理,只求会用,不求理解,因为真正理解一种技术是需要花费很多时间成本,然而没有这种精神,本书就不会呈现出那么多丰富而细致的内容,我希望读者能够从文字中感受到这种精神:我们必须真正喜欢和热爱技术,然后才能真正享受它带来的乐趣;同时我也希望这本书像一片宽阔的草原,读者可以在上面尽情自由地学习,畅游,能够发现和得到足够多这些知识带来的乐趣。

以下是本书的一个封面草图,它不一定是最终版本,但是封面图片是确定的,您也可以帮助我们设计封面,如果您的设计最终被采纳,我将赠送一本签名成书,以及在封面加上您的创作署名,感兴趣的朋友欢迎和我联系。

除此之外,本书作为一本聚焦于全局光照算法的书籍,虽然不会重点围绕一个渲染引擎或者一个渲染引擎相关的特性来展开讨论,但是例如像Unreal Engine 4这样的渲染引擎所具有的大部分渲染特性都会出现在本书的各个部分中。特别地,本书在讨论相关内容时,几乎都是优先使用Unreal Engine 4来进行描述和演示,本书会覆盖Unreal Engine 4的绝大部分渲染相关的内容,希望能够帮助读者更好地掌握和使用Unreal Engine 4游戏引擎。