*
继承遗志,砥砺前行。
Real-Time Rendering 4th 译文
**
章节1
介绍
实时渲染技术是关注于如何在电脑上极为快速地生成图像。它是与计算机图形最相关的领域。一张图像出现在屏幕上,观察者的动作或反应,和反馈会影响接下来生成的事物。这个反应与渲染的循环以一个极快的速率发生以至于观察者并不能分辨出个别独立的图像,而是沉浸于这个动态过程中。
这一播放图像的速率被用每秒的帧数来衡量(FPS)或者是赫兹(Hz)。当每秒一帧的情况下,只有很有限的交互性。用户会极其痛苦地感知到每个新图像的出现。大约6FPS时, 交互性才逐渐显现。电脑游戏致力于达到30,60,72或者更高的帧数。因为在这样的帧速率下,用户会专注于动作与反应。
电影制作者会用24FPS的速率来展现电影,但他们也要用一个快门系统来显示每帧二到四次来避免闪烁感 这种刷新的速率是与显示速率区别开来的,它是被用Hz来表示的。一个照亮帧三次的快门将会有72Hz的刷新率。LCD显示器同样区分刷新率与显示速率。
观看图像以24FPS出现在屏幕上是可以接受的,但是更高的速率对减少回应时间极其重要。仅仅15毫秒的暂时性的延迟就能减慢和干涉交互。举一个例子,头戴式的虚拟现实显示装置经常需要90FPS来最小化延迟。
实时渲染不仅仅是互动。如果速度是唯一的标准,任何可以对用户命令做出快速反应和在屏幕上画出任何东西的应用都能满足。实时的渲染基本上意味着生成三维图像流。
可交互性和一些连接到三维空间的感觉是实时渲染的充分条件,但是另外三分之一的元素已经变成了它定义的一部分:图形加速硬件。很多人认为1996年3Dfx Voodoo 1 card的发行标志着真正的消费者级别的三维图形硬件的问世。随着市场的急速推进,每一台电脑,笔记本和移动手机都集成了图形处理器。一些实时渲染结果的绝妙例子通过Figure 1.1 和1.2显示的硬件加速而成为了可能。
Figure 1.1 从Forza Motorsprt7 拍摄
Figure 1.2 在Witcher3中渲染的Beauclar城
在图形硬件的先进推动了关于可交互计算机图形领域研究的井喷。我们将聚焦于提供理论来提升演算速度和提升画面质量。我们同时也描述加速算法性和图形的API特点和限制。我们不能深入说明每一个主题,因此我们的目标是展现关键的概念和术语,并且解释在该领域最实用和健壮的的算法,同时提供到最好的地方获取相关信息的指向。我们相信我们的努力与尝试将提供给你帮助你理解这一领域的工具,它一定会让你觉得对得起你花费的时间与精力。
1.1内容总览
接下来是章节开始前的简洁总览
第2章,图形渲染管线。这是实时渲染技术的核心。是对场景进行描述的一系列步骤,使其转换为我们能看到的。
第3章,图形处理单元。 关于现代GPU如何通过固定的功能与可编程的单元的组合来实现渲染管线的各个阶段。
第4章,变换。 变换是用来操作物体位置,方向,大小,和物体的形状和相机的视角与位置的基本工具。
第5章,着色基础。讨论将会从材质的定义,灯光及其要理想化的表面呈现开始。当然这些效果是无论是写实的还是风格化的。一些关于呈现的其他的话题也会被提及,比如利用抗锯齿,透射和伽马矫正来创造更高质量的画面。
第6章,纹理。实时渲染的强大功能之一就是快速地读取和在物体表面显示图片。这一过程被称为贴图。当然还有很多基于该应用发展的理论。
第7章,对画面添加阴影会提高画面的真实度与对比度。那些流行的计算阴影的算法将会在这一章节呈现。
第8章灯光与颜色。在我提到基于物理的渲染的之前,我们需要去知道如何量化灯光与颜色。同时当我们完成基于物理渲染的流程后,我们需要将结果量转换成显示的值。它们将占据不同的屏幕比重和观察环境。这两个一前一后的操作都会在这章节提及。
第9章基于物理的渲染。我们从底层实现开始,建立对一个基于物理的着色模型的理解。这一章节首先讨论根本的的物理渲染,然后包含各种材质的模型,最后讨论如何混合材质并且过滤它们来抗锯齿和保证表面的效果不打折扣。
第10章,区域光,探索了描绘更精细光源的算法,表面着色考虑到了光是被有特殊形状的物体发射的。
第11章,在光与场景模拟多重交互的算法进一步提高了图像的真实感,我们讨论了环境遮挡和方向遮挡,以及在漫反射与镜面反射上渲染全局光照的方法,以及一些有前景的方法。
第12章,图像空间效果,图形硬件擅长快速执行图像处理,讨论了图像滤波和重投影技术。首先,我们调查了一种常见的后处理效果:镜头光斑、运动模糊和场景深度。
第13章超多边形,三角形并不总是描述物体最快最真实的方式,基于使用图像、点云的可代替表示,体素和其他样本集也各有优势。
第14章 体积和半透明渲染。这里的重点是体积材料表示的讨论和实践,以及他们和光源的相互作用,模拟的现象范围大规模的大气效果和细头发纤维的散射
第15章,非真实感渲染,试图使场景看起来真实只是渲染场景的一种方式,还有其他的风格,比如卡通着色和水彩效果也在研究,直线和文本生成技术也进行了讨论。
第16章,多边形技巧,几何数据来源广泛,有时需要进行修改以便于渲染得又快又好 ,多边形数据显示和压缩的许多方面都有提到。
第17章,曲线和曲面,曲面显示提供了一个优势,比如能够在质量与渲染速度之间进行一个权衡,越复杂的曲面,他的显示就越细致,表面就越光滑。
第18章管线优化,一旦应用程序运行并使用高效的算法,就可以使用各种优化技术使它运行得更快,找到瓶颈并且关于优化应该如何做,多重处理也在这有讨论
第19章加速算法,在你完成后,让程序再快点,大量的剔除和层次细节在这有提到。
第20章高效着色,场景中大量的灯光会显著降低性能,在没确定它是否可见前对其进行着色是浪费渲染资源的一个来源,我们在渲染的时候探索了大量的方法来解决这种低效的情况。
第21章虚拟和增强现实,这些领域在又快又连续有效生成真实感图像方面有特殊的挑战和技术。
第22章交叉测试方法。交叉测试对于渲染、用户交互、碰撞检测很重要,本文深入的介绍了常见几何相交测试的各种有效的算法。
第23章,图形硬件,这里的重点是组件,比如颜色深度,帧缓冲区和基于架构类型,提供了一个具有代表性的GPu的案例。
第24章 未来,我们一起设想。
由于空间限制,我们在realtimerendering.com上面做了有关于碰撞检测的免费下载的内容,和线性代数和三角函数的附录。
1.2 符号和定义
首先,我们应该解释书中使用的数学符号,若要更透彻的理解本节以及本书中使用的术语,请在realtimerendering.com获得线性代数附录
1.2.1 数学符号
表1.1,总结了我们将要使用的数学符号,这里将详细描述其中的一些概念。
注意,表中有一些例外的情况,在文献中使用符号的着色方程很容易被理解比如L(光照radiance)、E(辐射度irradiance)、σs(散射系数scattering coefficient)
表1.1
其中,角度和标量取自R,是实数。向量和点由粗体小写字母标识,表示方式如下所示。在计算机图形领域,默认均为列向量。但是有些地方使用(Vx,Vy,Vz),而非正确格式:(Vx,Vy,Vz)T,也仅仅只是为了阅读方便。
使用齐次表示法,一个坐标使用四个值表示v= (Vx Vy Vz Vw)T,其中向量为v=(Vx Vy Vz 0)T,点使用v = (Vx Vy Vz 1)T表示,有时候我们只使用三个元素的向量和点,但是我们避免使用这种任何不明确的类型,对于矩阵操作,向量的表示法和矩阵的表示法相同是非常有利的,有关更多信息,看第四章的“变换”,在一些算法中,使用数字索引取代x,y,z会非常方便,比如v = (V0 V1 V2)T,向量和点的这些规则也适用于两个元素向量,在这种情况下,我们只需要忽略三元素中最后一个元素即可。
矩阵值得多解释一下,我们通常使用的矩阵大小通常是2x2,3x3或者4x4,我们将会以3x3为例进行讲解,然后可以很容易的扩展到其他类型的矩阵。矩阵中的一个标量元素为Mij,0<=(i, j) <= 2,其中i表示行,j表示列,如下所示
下面的矩阵从矩阵M中使用了独立的向量m,j表示第i列的向量,和mi,表示第i行向量,
与向量和点一样,只要能更方便,列向量的序号也能够用x,y,z或者w表示。
一个平面通过数学公式π: n * x + d = 0表示,其中n为平面法线,表示平面的朝向,d是标量,如果是曲面,法线n为表面上某一点的法线,而如果是平面,所有的点的法线都相同。平面π将整个空间分成了两半,正的一半为:n * x + d > 0;负的一半为:n * x + d < 0。其它的点都在平面上。
表1.2给出了一些额外的数学运算符和概念,点乘,叉乘,行列式和长度运算符在realtimerendering.com下载的线性代数附录中进行了解释,转置运算符将列向量转换为了行向量,反之亦然,所以,列向量可以用(Vx,Vy,Vz)T表示,第四个运算符,是一个作用于两分量vector的一元运算符,作用是获取当前vector v = (Vx Vy)T的垂直向量,即:v⊥ = (-Vy Vx)T。我们可以通过|a|来表示标量a的绝对值,或者通过 |A|表示矩阵A的行列式,当然,我们也可以通过|A |=Ι|a b c |=det(a, b, c)来表示矩阵,其中a、b、c为矩阵的列向量。
第8、9个运算符,是clamp运算符,在着色计算中经常会被使用,第8个运算符的目的是如下:
第9个运算符是如下意义
第10个运算符的定义如下:
第11个运算符是二项式因子,定义如下:
表1.3
之后,我们将x = 0, y = 0, z = 0这三种平面称为坐标平面或者轴对齐平面。而轴ex = (1 0 0)T , ey = (0 1 0)T , ez = (0 0 1)T为主轴或者主方向,分别为x轴、y轴、z轴。这组轴通常被称为标准基。除非有特别说明,我们都将使用正交基(由相互垂直的单位向量组成)。
[a; b]用于表示a和b中间的值,包含a和b。(a; b)用于表示a和b中间的值,不包含a和b。[a;b)表示A和B之间的所有数字,包括A但不包括B。
文中还经常使用到atan2(y,x)。它是arctan(x)的扩展,arctan的常用方式为arctan(y/x),但是当x=0的时候,就会出现“division by zero”的错误。但是如果使用atan2(y,x)就不会这样。
log(n)指的是自然对数,loge(n),而非以10位底的对数,log10(n)
计算机图形领域,默认3D坐标系为右手坐标系。颜色将由三分量vector表示,比如(r,g,b),每个分量的范围为[0, 1]
1.2.2 几何定义
几乎所有的图形学硬件所使用的基本渲染图元(也被称为渲染图元)都是点、线、三角形。
在本书中,我们将几何实体的集合看成是一个模型或者一个对象。而场景则是包含所要渲染的环境中所有模型的集合,场景还包括了材质、光照和视角信息。
一辆车、一栋建筑甚至一条线都可以被称为是一个对象。实际上,一个物件通常是由一组绘制图元组成,甚至有可能由更高类型的几何组成,比如贝塞尔曲线(Bézier curve)、曲面或者细分曲面。另外,一个对象也可以由其他的多个对象组成,比如汽车就是由4个门对象、4个轮子对象组成等。
1.2.3 着色
根据公认的计算机图形学用法,本书中提到的"shading"、"shader"以及相关的文字都对应着两种有区别,但是又有联系的概念:计算机生成的可视化外观(比如:“shading model”、“shading equation”、“toon shading”),或者是渲染系统中的一个可编程组件(比如:“vertex shader”、“shading language”)。不管是哪一种,通过上下文都应该可以很容易看出来。
更多的阅读资源
其他我们能给到你的最重要的资源就是这本书的网站:http://www.realtimerendering.com。其中包含了最新信息以及本书中每章内容关联的网址链接。实时渲染领域在时刻变化着,本书中我们试图将重点放在基本概念和不太可能过时的技术概念。而网站中我们可以展现当今软件发展相关的信息,并且我们有能力使其保持最新