Chapter 10 – Local Illumination 局部光照

在第九章中,我们学习了基于物理的材质理论,以及如何通过精准光源来模拟这些材质。有了这些知识点之后,我们就能够模拟光与物体表面的交互,并且计算出到camera方向上的光的辐射率。这一光谱辐射率就是最终所显示的图像中的像素颜色。

不过到现在为止,我们所研究的效果都是基于点光源与方向光源,这限制了表面所接受的光的方向。现实中,物体表面将从各个角度各个入射方向接受光。外界的物体并不只是被太阳所照亮。否则,那些处于阴影中的物体,或者背离阳光的物体将会是完全黑色的。天空是一个重要的光源,其由阳光在大气的散射所造成。如果没有天空这一光源,那么我们所处的环境将与月球相似。

在现实中,光照永远都不是精准的。为了实现一个更为仿真的光照模型,我们需要在表面的入射方向上的半球范围内对BRDF进行积分。在实时渲染中,我们更倾向使用某些渲染等式来模拟这些积分运算。通常,我们会避免对多个采样(光线)进行平均,因为这种方法的计算过程开销太大。如下图所示,左侧部分表示我们在第九章中所使用的积分,表面区域以及精准光源。右侧部分则是我们本章节的目标,将我们的着色运算延伸至光源表面的积分。

阅读更多Chapter 10 – Local Illumination 局部光照

Chapter 9 – Physically Based Shading 基于物理的着色

在本章节中,我们将学习基于物理的着色。在第一小节中,我们将先了解一些关于光线物理交互的知识,在第二至第四小节中,我们将了解这些物理因素是如何运用到着色过程的。在第五至第七小节中,我们将构建基于物理的着色模式。在第八至第十二小节中,我们将学习各种不同的材质类型所使用的着色模式。在最后一小节中,我们将学习材质与材质之间是如何融合的,以及如何避免锯齿,同时保留材质的外观表现。

阅读更多Chapter 9 – Physically Based Shading 基于物理的着色

Chapter 8 – Light and Color 光与颜色

我们在之前几章中学习的RGB颜色值光线的强度与颜色。在本章节中,我们将会学习由这些值所定义的光线的物理属性,并未之后的章节打下基础,以物理的角度学习渲染。同时,我们也将学习被大家所忽略的,但是渲染过程中不可缺少的另一个部分:将场景中线性的光线值转换为最终的显示颜色。

阅读更多Chapter 8 – Light and Color 光与颜色

Chapter 7 – Shadows 阴影

如果想要创建写实的画面,阴影无疑是非常重要的。本章节中,我们将会着重学习计算阴影的基础原理,并且了解实时渲染中最为重要与常用的阴影算法。但是本章节并不会覆盖所有关于阴影的知识点,笔者在此为大家推荐了两本书,分别为Real-Time Shadows以及Shadow Algorithm Data Miner

本章节所使用的专业术语如下图所示,occluder(遮盖物)表示将会在receiver(接收者)上投影阴影的物体。精准光源(punctual light),例如那些没有区域或者空间限制的光源,只会生成完整的阴影区域,有时这一类阴影也被称为hard shadows。如果我们在场景中使用了区域光源或者体积光源,那么就会生成soft shadows。每一个阴影可以拥有一个完整的阴影区域,其被称为umbra;也拥有一个局部的阴影区域,其被成为penumbra。

阅读更多Chapter 7 – Shadows 阴影

Chapter 6 – Texturing 贴图

物体表面的贴图就是我们看到的并感受到的——也可以将贴图想象成一幅油画。在计算机图形学中,贴图是一个过程,其读取了物体表面的每一个点并且基于图像,函数或者其他数据改变了每一个点的外观。例如,为了展现一块砖头的外观,我们不可刻意展现其几何上的细节,而是将砖头的图像应用在一个矩形上,这个矩形由两个三角形组成。当我们观察那个矩形时,砖块的图像便会出现在矩形所在的位置。除非我们靠得非常近,否则是无法注意到砖块缺乏几何细节。

但是,除了由于缺乏几何细节,一些贴图后的砖块效果仍然不佳。例如,砖块的表面看上去应该是粗糙的而不是光滑的。为了让物体看上去更为真实,我们会使用第二张图像贴图。这一张贴图并不会改变物体表面的颜色,而是基于表面的位置改变其粗糙度。现在,我们的砖块物体拥有一张表现颜色的贴图和一张表现粗糙度的贴图。

现在砖块看上去是粗糙的,但是我们可能会觉得砖块的表面是简单的平面。而真实世界中砖块的表面应该是高低起伏的。通过使用bump mapping,砖块的着色法线将会各不相同,所以在我们绘制砖块的表面时,它们将不再是一个简单的平面。这一类的贴图将会改变矩形原始的表面法线向量。

从阴影的角度来说,上述bump mapping造成的物体表面凸起的“假象”会被识破。例如,砖块凸起的部分在某些视角下可能会遮住凹下去的部分。至少凸起的部分会在凹陷部分投射出阴影。parallax mapping使用一张贴图改变平面的形状,parallax occlusion mapping则会基于高度贴图进行射线检测让画面的真实性更高。displacement mapping通过改变模型中三角形的高度来改变模型的外观。

上述例子中的这些问题都能通过贴图解决,其相应的算法也会越来越精巧。在本章节中,我们将学习贴图技术的各个细节。首先,我们会展示贴图系统的常见框架。之后,我们将专注于使用图像为物体表面贴图,这也是实时渲染中贴图最常用的功能。最后则是程序化贴图以及一些常见的使用贴图来影响物体表面的方法。

阅读更多Chapter 6 – Texturing 贴图

Chapter 5 – Shading Basics 着色基础

当我们在绘制一个三维物体时,模型不但应该拥有合适的几何形状,还应该拥有正常的视觉表现。根据应用类型和游戏类型的不同,视觉表现可以是,写实的——表现近似于真实的物体,也可以是其他不同的非写实类型。

本章节将会讨写实的和其他非写实的渲染模式。第十五章将主要讨论非写实的渲染模式,而第九章到第十四章将会专注于写实的渲染模式所使用的PBR(physically based rendering)技术。

阅读更多Chapter 5 – Shading Basics 着色基础

Chapter 3 – The Graphics Processing Unit

历史上图形学的发展起始于在每个像素的扫描线与三角形重叠处的颜色插值,之后显示这些值。还包括读取图像的能力,其允许我们将贴图运用于物体表面。加入了用于插值以及z-depth测试的硬件。由于这个部分的使用频率很高,这一部分处理由硬件直接负责,以增加处理性能。而渲染管线的更多部分以及每个部分更多的功能在之后的世代中被不断地加入。专业图形硬件相较于CPU的唯一优势就是速度,但是速度非常的重要。

在过去的20年中,图形硬件已经发生了极大的变化。第一个包含硬件顶点处理的消费级图形硬件在1999年面世(NVIDIA GeForce256)。NVIDIA创建了graphics processing unit(GPU)这一术语,用以区分GeForce256与之前只能进行光栅化的芯片,但之后行业就停滞不前了。几年之后,GPU从只能进行设置的复杂固定功能管线进化成高度可编程的模块,开发者能在其中实现自己的算法。各种类型的可编程着色器是我们控制GPU的主要方法。出于效率的考量,部分管线仍然只能设置,并不能编程,但是可编程以及灵活性是整体的行业趋势。

GPU专注于一组高度可并行的任务,所以其处理速度非常快。它拥有主要运行z-buffer,主要用于读取贴图图像以及其他buffer,以及主要负责检测哪一些像素与三角形相交的各种客制化芯片。我们在第二十三章中会学习这些芯片如何完成它们的任务。在这之前我们更需要了解GPU是如何并行处理它的可编程着色器。

在3.3小节中,我们将解释着色器的功能。现在,我们只需要知道着色器是一个小型处理器,其会处理一些相对独立的任务,例如将一个顶点由其在世界空间内的位置转换至屏幕坐标,或者计算一个被三角形覆盖的像素的颜色。随着每一帧数以千计或者数以百万计的三角形被传输至屏幕,每一秒可能会有十亿计的着色器调用(shader invocation)

首先,延迟(latency)是所有处理器都需要面对的问题。读取数据是需要时间的。一般我们可以认为,如果信息距离处理器越远,那么等待的时间就越长,这就是延迟。在第二十三章中,我们会学习更多关于延迟的细节。相较于位于本地寄存器中的信息,从内存芯片中读取信息会花费更长的时间。在第十八章中,我们将会讨论更多关于内存读取的内容。最关键的是,等待读取数据的时间意味着处理器是闲置的,其会降低效率。

阅读更多Chapter 3 – The Graphics Processing Unit