我猜大部分读者第一次翻开一本新书的时候,会首先定位到目录部分,寻找自己感兴趣的内容,如果发现一些甚至部分章节的内容是自己不太熟悉而又正渴望学习的,这个对口的内容基本上决定了购买欲望;接下来的动作则是定位到书中对应这些章节的地方,感受作者的写作风格,知识点讲解的精准性与难易度等,这两个动作决定了这本书在他心目中的份量。

而我却习惯于通过前言部分来获得对一本书的期待程度,其原因是因为知识的逻辑性比知识本身更重要。那么什么是知识的逻辑性?实际上这是我自己的一种思考,并未在什么地方看到过这样的概念。在我自己的体会中,学习知识分为两个方面,其一是一个个具体的知识点,例如C++语言的多态性;第二则是关于这些知识点之间的联系,我把它称为知识的逻辑性,知识逻辑性获取的难度要远远高于知识本身。科技的进步是知识的累积的结果,这意味着我们这一代人需要比上一代人学习更多的知识,随着这种量的增加,我们越来越多地需要去梳理这些庞杂知识点之间的联系,才能真正地理解和掌握一门技术。而通常,我们需要大量的阅读量才能总结出这些知识点之间的逻辑联系。

那么我到底想说明什么呢?首先在一本书中,各个章节通常还是偏重于讲述知识点(在局部知识点范围内通常很难清晰地描述全局知识逻辑性),所以在我看来,一本书最适合描述知识逻辑性的地方就是一本书的前言部分。有时候我通过一本书的前言部分,就能对我过去一些零散知识点行成一个更好的认识和归纳;其次,由于每个人的知识逻辑性是不一样的,因此针对同样知识点的两本书,作者可能分别从完全不同的角度来讲述和理解,这其中反应的正是作者建立他的知识逻辑性的过程,这也可以间接用作这本书质量的一个权衡量。通常知识逻辑性更强的作者更倾向于在前言部分描述他建立自己知识逻辑性的过程,这甚至有时候比他书写某个章节的内容更痛快。

客观地说,这个世界上已经不乏优秀的关于计算机图形学的书籍,例如实时渲染的经典书籍《Real-Time Rendering》,离线渲染中聚焦于光线追踪算法的《Physically Based Rendering: From the Theory to Implementation》,讲述高级全局光照的《Advanced Global Illumination》还有大量讲述OpenGL,Direct3D等业界主流底层图形接口的,以及各种针对高校学生偏重理论基础的计算机图形学教材。那么世界为什么需要另外一本计算机图形学的书籍?

本书的逻辑

我在大学本科的专业不是计算机科学技术,那个时候只是出于对计算机的兴趣,以及在那个年代计算机互联网的蓬勃发展的背景下,我选择了要在毕业以后从事软件开发相关的工作,并且在大学阶段后两年的时间,我几乎将所有时间和精力用于学习计算机相关的知识。然而这仅限于传统的软件编程,直到工作两年之后,我才真正开始计算机图形学相关知识的学习。

在这期间,我阅读了大量关于计算机图形学的书籍和论文,从各个高校的一些经典教材,到各类以OpenGL等图形接口为核心的实践性比较强的书籍,以及这些图形接口的官方API文档等。我发现计算机图形学学习起来非常困难,不仅因为其知识繁多,也跟当前市面上相关书籍的总体情况有关。

目前关于计算机图形学的书大概可以分为三类:第一类(也是数量最多的一类)以各个分散的理论为基础,按类别逐个介绍各个知识点或者渲染过程中的某个阶段,例如Texturing,Material,Shadow,BRDF,Environment Lighting等等。各种大学的计算机图形学教材大都是这一类,前面提到的《Real-Time Rendering》也是属于这一类。这一类书籍是开始学习计算机图形学最好的入门资料,逐个了解计算机图形学相关的各种概念。然而这类书籍的缺点是缺乏系统性,读者很难对渲染过程有个整体上的认识,这种知识逻辑性的缺乏反过来会制约对某些概念的理解。

第二类以图形接口如OpenGL等为基础,围绕传统的渲染管线来介绍计算机图形学的各个概念,例如GLSL,Vertex/Pixel Shader,Tessellation,Blending,Frame buffers等等。这类书籍通常具有一些完整的示例,读者能够对经典的渲染管线有一个总体认识,并对各个理论知识点在渲染流程中的运用有一些理解,反过来会促进知识的逻辑性。然而实际工业中使用的渲染方法会比经典的渲染管线要复杂得多,例如它可能需要分多次渲染(每次称为一个Pass),每次生成最终结果的部分内容,最后进行合成,例如对动态和静态物体的分开处理,对阴影的处理,对光照的处理,以及最后对全屏Ambient Occlusion的处理等;另外,很多工业中使用的渲染方法都需要许多特定的数据支持,这可能需要渲染管线读取GPU中特定格式的数据并使用特定的算法来实现渲染的某个阶段或过程,这些方法的理论一般是这类书籍不会涉及的。

第三类书籍则综合计算机图形学理论以及图形硬件环境,图形硬件API等,详细阐述一个完整,系统的渲染解决方案。我认为此类书籍最利于构建知识逻辑,因为其不光告诉我们怎样使用图形API来实现光照,它更能清楚地告诉你,各种计算机图形学概念怎样被运用在实践中,你就能够轻易地理解每个理论的作用和机制,针对同一个问题,你甚至也许能够提出自己的思路,使用不同的理论方法来解决这个问题。只有在这样的条件下,构建起属于你自己的知识逻辑,才能真正系统性地理解计算机图形学,从而更有效地进一步学习以及解决工作中的实际问题。本书正是属于这类书籍。

由于渲染过程的复杂性(例如一个渲染器要实现场景表述,坐标变换,表面着色,对函数的采样,各种全局光照模型,光源等等,其中全局光照模型部分尤其复杂),尤其是在实时渲染领域,全局光照不能通过像光线追踪一样单一的解决方案实现,而需要融合多种方法,其中每种方法可能实现一种单一的全局光照效果(如Soft Shadow,Ambient Occlusion,Reflection,Subsurface Scattering等等),这些细节通常不是一本书能够覆盖的,这几乎相当于是从渲染的角度讲述一个完整的游戏引擎的实现。这类书籍又可以分为两个小类,其中第一类以光照模型相对比较单一的离线光线追踪(见本书第\ref{chp:path-tracing}章)为基础,它通常附有比较完整的源代码实现,这类书籍的经典代表是《Physically Based Rendering: From the Theory to Implementation》。另一本最新也是更入门级的书籍则是Peter Shirley的Ray Tracing系列迷你书籍,本书则是属于第二小类书籍。

为了帮助读者系统性地建立知识逻辑,同时讲述除光线追踪以外更多更复杂的光照模型,第二小类书籍大多以理论为基础,而忽略可能非常繁琐的细节(这些细节可能远远超过一本书的篇幅)。这类书籍的经典代表作之一是《Advanced Global Illumination》,它着重于讲述光线追踪和辐射度两大基本的渲染方案,并且简要介绍了结合这两种理论各自优点的一些混合理论,例如Bidirectional Tracing,Irradiance Caching,Photon Mapping,Instant Radiosity等;另一本聚焦于Photon Mapping的书籍《Realistic Image Synthesis Using Photon Mapping》也值得一阅。

我们看到这两个小类的书籍各自拥有自己的优缺点:第一类具有比较完整的示例帮助读者构建更具体的知识逻辑,但是其内容限于比较单一的光线追踪模型;第二类能够覆盖更广泛的光照模型,但是其很难在一本书的篇幅内详细讲述其实现细节。那么有没有可能综合它们各自的优势呢?

随着计算机硬件性能的不断提升,计算机图形学正经历着飞速的发展。每年的SIGGRAPH\footnote{SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形专业组)组织的计算机图形学顶级年度会议。第一届SIGGRAPH会议于1974年召开,参见:\url{http://www.siggraph.org/}。}图形学专业会议产出几百篇计算机图形学论文,这些论文大都由一些高校,从事基础图形学理论研究的机构,或者计算机产业中从事图形硬件及接口相关的公司(例如AMD,Intel,Nvidia等)发表,每篇论文大都是一些计算机图形学基础理论的工作。这些基础理论然后被一些从事游戏开发,电影动画及特效,游戏引擎厂商等融入进图形渲染工具中,与其它方法一起形成各种完整的光照解决方案。这些高层的解决方案的结果通常在GDC\footnote{GDC(Game Developers Conference)是全球规模最大的游戏开发者年度专业性会议与展览,其提供开发者之间的技术交流等平台,参见:\url{http://www.gdconf.com/}。}及其类似的专业会议上,通常以非正式的演讲的方式释出。

所以光照模型最前沿的解决方案,来自于那些工业级的顶级游戏公司(如顽皮狗),游戏引擎厂商(如CryEngine,Frostbite,Unreal Engine等)以及动画电影公司(如皮克斯,迪斯尼等)。围绕这些工具及产品来讲述计算机图形学,不仅能够兼顾到各种各样前沿的实现方案,读者还能够通过使用这些产品去了解该实现的最终效果和功能。

本书正是基于这样的理念来编排整本书的内容:我们以当前业界最前沿的一个个完整的全局光照解决方案为核心内容,通过结合讲述使用这些解决方案的工具及其产品的特性及功能,来达到更系统性地学习计算机图形学的目的,帮助读者更好地构建自己的知识逻辑。

全局光照

全局光照几乎代表了计算机图形学渲染相关的全部内容,它是一个渲染器力求模拟真实物理世界关于物体表面交互的全部自然现象的全部内容(当然目前计算机图形学研究领域主要限于几何光学,它并不包括更微观的如干涉,衍射等光学现象,参见第1章的介绍):即光从光源出发,以无限的速度在环境中直线前进,经过与表面发生多次反射和折射,最后进入人的眼睛形成图像。

然而由于光照方程是一个沿全空间方向的积分,这使得渲染过程非常耗时,在现有的硬件条件下几乎不可能按照原始的光照方程进行图形渲染。不过研究发现,我们并不需要完全按照原始的光照方程进行计算,即可以达到令人信服的图像,在这个级别我们通常称为Realistic Rendering。于是人们寻求简化的光照模型以求能达到这种渲染品质,在原始光照方程的基础之上,人们提出两种简化模型:

\begin{itemize}
\item \emph{基于有限元分解的辐射度理论 } 有限元分解是一种常见的积分计算方法,它将一个沿无限空间的积分分解为一个有限纬度(称为一个有限元)的积分,在每个纬度,我们只需要求出该有限元的均值,并可以很容易地计算出光照积分方程。在辐射度理论中,通常我们通过Monte Carlo等方法预计算出每个有限元的均值,供渲染时光照方程的实时计算。
\item \emph{基于Monte Carlo方法的光线追踪技术 } Monte Carlo方法通过随机抽样,使用有限个采样点的值,来计算积分方程的值(详见本书第2章的内容)。
\end{itemize}

这两种方法均能达到非常高的图像品质,然而它们的计算仍然十分耗时,因此主要用于电影等离线渲染领域(例如皮克斯的渲染产品RenderMan就是基于光线追踪的渲染器)。在游戏等实时渲染领域,人们寻求更简化的渲染模型,与辐射度和光线追踪技术通过简化积分方程的思路不同,实时渲染领域的主意思路是根据光学现象或者其它理论拆分光照方程,使得光照效果最终由多种效果叠加而成,例如直接Direct lighting(光从光源出发经过物体表面反射或者折射一次后进入人眼),(Soft )Shadow,Diffuse lighting,Specular lighting,Indirect lighting, Ambient Occlusion, Subsurface Scattering, Environment lighting, Reflection等等。

这些效果可能分别使用不同的方法来计算,例如Shadow可以使用GPU的特性来计算,Ambient Occlusion可以使用Post processing基于屏幕空间(Screen Space)进行计算,Environment lighting则可以使用简单的贴图实现;另一些算法则使用一些特定的数据格式来加速其中的一些计算,例如Unreal Engine 4通过对整个场景构建一个Distance field的数据结构,通过它来加速遮挡关系的计算从而实现Soft shadow以及Ambient occlusion等效果,其它一些方法则通过使用Spherical Harmonic来存储一些点“环境函数”,从而能够快速地计算各种间接反射的效果。

计算机图形学可能是计算机领域最活跃的领域之一,研究人员(尤其是实时领域)和工程师一直在致力于开发新的技术来加速光照的计算,这使得图形学的内容和分支越来越庞杂,初学者想要掌握这些知识必需要花费大量的时间和精力,才能理解这些技术之间的关系,优缺点等,从而更好地改进产品的渲染性能及品质。这就需要非常具有知识逻辑性的书籍来加速工程师对计算机图形学的掌握和运用。

反过来,一本以全局光照为核心内容的书籍,必须要覆盖到以上这些提到的各种各样的图形学理论。所以通过本书,你能够更系统地综合学习和理解各种计算机图形学的基础理论知识。

本书特点

尽管从以上的说明读者可能已经基本了解本书的写作风格及内容,为了便于读者更简单快捷地了解本书的特点,并通过这些特点来决定是否需要进一步阅读这本书,这里还是将本书的特点更清晰地总结如下:

\begin{itemize}
\item \emph{知识逻辑性强,覆盖面广 } 一个完整的全局光照解决方案,要充分考虑渲染的各个方面,从游戏场景元素的几何表述,用于光照计算的(CPU和GPU)数据内存结构,到各个渲染通道,每个通道的每个阶段,各种光学现象的实现等,它几乎囊括了大部分图形学的知识。因此读者能够通过对完整的全局光照模型的学习,建立起极强的计算机图形学知识的逻辑和系统性认识。
\item \emph{覆盖业界最前沿的图形学知识 } 计算机图形学领域近些年虽然发展非常快,但是其基础理论几乎没有太大变化,这些变化大多体现于工业中(例如对现有算法的改进,使用一些额外的数据结构来加速实时计算等),所以这些变化通常不会反应在以计算机图形学理论为基础的书籍中,但本书讲述当前工业中使用的游戏引擎及中间件等产品的全局光照实现,所以它能够覆盖最前沿的图形学知识。
\item \emph{详细分析各大游戏引擎,实用性强 } 本书从第\ref{chp:path-tracing}章起,几乎每章都是围绕一个或多个游戏引擎工具,或者某些中间件产品的全局光照方案进行介绍,在学习这些全局光照方案的同时,读者也能够学习这些工具的特性及原理,从而更好地理解和使用这些工具。本书覆盖了Unreal Engine 4,CryEngine 5,Unity 5等业界主流商业游戏引擎的全局光照解决方案,此外本书还介绍了Enlighten,PowerVR公司图形处理器的Ray Tracing等中间件的实现和使用,同时覆盖这么多工业级的产品,对于积累读者的专业经验以及扩大知识面都是极为有益的。
\item \emph{循序渐进的方式学习不同的全局光照模型 } 这些各种不同的全局光照解决方案彼此之间并不是完全独立的,它们有着极强的关联,你能够从一种解决方案中看到另一种方案的不足,一种解决方案可能是另一种解决方案的改进和优化。例如Path Tracing是与摄像机视角相关的,因此改变视角则需要重新计算,而Radiosity则与摄像机视角无关,因此它可以将数据预处理,并且能够实现渐进式计算(即将复杂的计算分布于多帧中,每帧计算一个增量并累加至一个精度更高的结果);为了加速光线追踪计算,与Path tracing直接从物体复杂的几何表述中获取光照信息不同,Photon mapping方法则将光照信息存储为一个独立的数据结构(称为Photon map)这大大加速了光线追踪的计算。我们可以看到,这些不同的全局光照模型之间的联系本身也能促进我们更透彻地理解这些概念。
\item \emph{实时和离线渲染相结合 } 大多数关于计算机图形学的书籍,都是专门针对实时或者离线渲染领域,例如《Real-Time Rendering》针对实时渲染,而《Physically Based Rendering: From the Theory to Implementation》聚焦于离线渲染。而客观的事实是,实时和离线渲染同属于计算机图形学领域,它们只是在当前硬件水平下针对实时性需求的划分,因此,不仅作为渲染工程师我们需要同时掌握实时和离线渲染,另一个事实是,实现渲染中的静态光照贴图,其它一些预处理数据等都是需要借助于离线渲染来实现;此外,很多实时的全局光照模型都是从离线渲染模型优化,改进而来,学习离线渲染对实时渲染中概念理解有极大的帮助。因此本书不特别区分实时和离线渲染,当然我们会特别说明每个光照模型的实时性。
\item \emph{符合按需学习的知识学习过程 } 很多书籍都是按照知识模块的分类进行章节划分,一个知识点接着一个知识点,先讲解理论知识,最后再把这些理论用于实践当中。而人类的学习特点通常是首先遇到问题,然后再去寻找和学习解决该问题相关的知识。在本书中,我们并不在前面的章节首先按模块介绍后面的章节会使用到的基础理论,而是围绕一个全局光照模型为核心,然后在需要的地方学习对应的基础理论知识。例如第\ref{chp:path-tracing}章涉及针对硬件的优化,我们就在第\ref{chp:path-tracing}章讲述GPU的内存模型;第\ref{chp:prt}章涉及表面的多项式表示,我们就在第\ref{chp:prt}章讲述Legendre Polynomials以及Spherical Harmonics等(当然本书还是在前两章首先讲述本书会涉及到的最重要和基础的知识)。这也是笔者平时的学习方法和习惯。
\end{itemize}

此外,本书还列出近百篇本书写作期间参考的论文及书籍资料,并在书中每个地方指出具体的参考论文供读者进一步阅读,相信这些资料能够大大丰富和完善读者的知识量。

写作范围

本书定位于计算机图形学领域的中,高阶书籍,虽然全局光照技术涉及到计算机图形学的各种基础理论,但是本书并不会对这些基础理论做深入的介绍,相反,本书假设读者对这些基础理论有一定的了解,例如你要能够明白贴图的原理及实现方法,顶点及像素着色器的作用,光栅化等等基本概念。

本书聚焦于各种全局光照解决方案的实现思路,例如它需要的内存数据结构,它涉及到的渲染通道以及每个通道的作用,光照模型工作的流程,它的核心算法使用的基本公式及原理;此外,本书还特别讲解每种全局光照模型对特定的光学现象的实现及不足。总之,本书更偏向于讲解每种全局光照模型的实现原理及过程,而非每种图形学相关的概念本身。

章节概要

\emph{第\ref{chp:intro} 章:计算机图形学基础 } 介绍计算机图形学最基本也是本书的基础知识,包括全局光照中的各种现象,光照方程中的各种度量,光与表面的交互,光照方程,BRDF理论以及基于物理的渲染相关的理论。本章所涉及的计算机图形学基础知识是与具体的全局光照模型以及所使用的图形接口及图形硬件的特性无关的。

\emph{第\ref{chp:pipeline} 章:图形硬件及渲染管线 }

\emph{第\ref{chp:mc} 章:Monte Carlo积分 } Monte Carlo积分是Path tracing的核心基础,它也是计算机图形学中广泛用于各种预处理数据计算的工具。Monte Carlo通过使用随机模拟对积分函数进行采样,利用有限的采样点来近似无限元积分方程的值。本章将介绍概率论基础,随机变量的定义,期望,估计,Monte Carlo积分的推导,对随机变量的采样方法,以及减少随机采样方差的方法。

\emph{第\ref{chp:path-tracing} 章:光线追踪技术 }

\emph{第5章:辐射度理论 }

\emph{第6章 }

\emph{第7章 }

\emph{第8章 }

\emph{第9章 }

读者群体

本书针对的读者群体主要为与计算机图形学有关的学生,教师,研究者,研究机构,游戏开发工程师,正在或者希望使用Unreal Engine 4,CryEngine 5, Unity 5等游戏引擎开发各种产品的开发者,以及其它行业与图形学有关的从业人员,例如影视动画行业等。

阅读本书,读者需要具备本科或大专及其以上学历,或者对线性代数,微积分等大学基础课程具有一定理解的同等基础的人员;本书定位为计算机图形学领域的中,高阶书籍,因此读者最好对计算机图形学基础理论有一定的了解,熟悉一般3D渲染的概念。

本书可以作为学习计算机基础理论的资料,更可以作为巩固自己已有图形学知识,系统性地理解这些基础理论在工业中怎样被实际运用。

关于专业词汇

按照中文出版惯例,中文书籍当中的英文专业词汇应该全部翻译为中文。然而出于以下原因,本书采取保留所有英文专业词汇:

\begin{enumerate}
\item 有大量的计算机图形学专业词汇并没有完美的中文翻译,例如Post Processing翻译为后处理并不能准确表述其意,这在某种程度上不仅使得文句意思晦涩,更容易使读者对其知识点没有更精准的理解。
\item 在计算机图形学领域,大部分的书籍,文献和专著都是以英文书写的,在读者的后续学习,以及甚至在本书的学习过程中,常常会需要查阅更多的英文资料,因此保留英文专业词汇更利于后续学习。
\end{enumerate}

当然,本书中保留的英文词汇仅限专业术语,即名词。对于一个术语用作动词的情况,本书仍然会选择使用更精准中文文句来描述其意义及过程;同时,对于部分具有完美翻译的专业词汇,按照本书的思路仍然将保留英文形式;另外,对于某些英文书籍或文献,其可能已被翻译为中文资料,为了便于查阅,本书仍将提供英文名称,读者需要自己查询是否具有相关中译本;最后,对于所有这些专业词汇,本书的索引部分会有全书的引用位置供读者查阅。