第一章 Introduction(导论)
实时渲染主要是有关使用计算机如何快速生成图像的过程,这是计算机图形学中最具有交互性的领域。交互性是指在屏幕上显示了一幅图像,观察者会据此作出某些行动或反应,并反馈给计算机以生成下一幅图像。当这种不断反应并渲染的循环过程执行的速度足够快时,观察就会沉浸在一种动态的变化过程中,而不是简单地看到多个单独的图像。
图像显示的速度可以使用frames per second(fps)或者Hertz(Hz)进行表示。如果一秒钟渲染一帧图像,就无法感觉到交互性,观察都就会痛苦的等等每一幅新图像的到来。当渲染速度达到大约6 fps,就会开始产生一点点交互的感觉。如果一个应用程序的显示速度达到15 fps就完全是实时的,观察都就可以重点关注作用和反作用。然而,实时的交互性有一个上限。在显示速度大于等于72 fps时,实时性就无法有效的察觉到。
虽然图像闪烁速度达到60 fps时显示效果可能就是可接受的,但是要减少交互响应时间,一个更高的速度是非常重要的。即使是延迟时间尽可能少于15毫秒也会降低并干扰交互性。如果以速度作为唯一标准,任何应用程序只要能够快速响应用户命令并在屏幕上绘制图像都是符合要求的。实时渲染通常是指三维渲染。
构成实时渲染的充分条件是交互性,以及某种意义上与三维空间的关联性,但是定义实时渲染还需要第三个组成部分:图形加速硬件(graphics acceleration hardware,显卡)。虽然专门用于三维图形加速的硬件已经在专业的计算机工作站中使用了很多年,但直到最近几年面向普通消费者的显卡才真正成为可能。人们普遍认为1996年推出的3Dfx Voodoo 1是第一个消费级显卡。近年来随着消费级显卡的快速发展,在家用计算机上添加一个三维图形加速硬件与添加一对扬声器一样简单。虽然对于实时渲染来说显卡不是绝对必要的,但是在大多数实时应用程序中却是不可或缺的。图1.1中显示了一个使用显卡执行实时渲染的示例生成的逼真的图像结果。
图1.1. A wonderful image from the Toy Shop demo [1246, 1247, 1249], generated at interactive rates. (Image courtesy of Natalya Tatarchuk, ATI Research, Inc.)
在过去的几年里,显卡的发展在交互式计算机图形学领域已经得到了爆发式的研究成果。在本书中我们将重点讲解提高渲染速度以及改进图像质量的方法,同时还会描述加速算法和图形APIs的特点及局限性。由于我们无法深入涵盖每一个图形学主题,因此本书旨在介绍概念和术语,使读者在一定程度上知道如何以及何时使用某种方法,并提供深入学习某个主题的最好的参考资料。我们希望本书中所提供的内容是值得你花时间和精力去学习的。
1.1 Contents Overview(内容概述)
以下先简要概述本书所有章节的内容。
- 第2章,The Graphics Rendering Pipeline。本章描述了实时渲染的核心内容,即把一个场景描述的输入数据,经过处理转化成我们能直接看到的图像。
- 第3章,The Graphics Processing Unit(GPU)。现代的GPU架构一般会结合使用fixed-function(固定功能)和programmable units(可编程单位)实现rendering pipeline的各个阶段。
- 第4章,Transforms(变换操作)。Transforms是一组变换矩阵,用于操控objects的位置,方向,尺寸和形状,以及camera所处的位置和观察方向。
- 第5章,Visual Appearance。本章开始讨论材质和光照的定义,以及使用它们实现逼真的外观。另外还讨论了其他的与显示外观相关的主题,比如通过antialiasing(抗锯齿)和gamma correction(伽玛较正)生成更高质量的图像。
- 第6章,Texturing(纹理贴图)。实时渲染最强大的功能之一是能够快速读取并显示纹理数据,比如在物体表面显示图片。本章主要讨论这种称为纹理贴图技术的实现机制,并举出了这种技术的各种使用方法。
- 第7章,Advanced Shading(高级着色)。本章主要讨论正确显示材质的理论与实践方法,以及point light(点光源)的使用方法。
- 第8章,Area and Environmental Lighting(区域和环境光照)。在这一章,将会详细探讨多种光源以及相关算法。
- 第9章,Global Illumination(全局光照)。首先介绍了shadow(阴影),reflection(反射),refraction(折射)算法,然后讨论了有关radiosity(辐射着色),ray tracing(光线追踪),precomputed lighting(预计算光照)和ambient occlusion(环境光遮蔽)的主题内容。
- 第10章,Image-Based Effects。在描述类似于自然光斑或火焰现象(或物体)时,使用polygons并不是最快或最真实的实现方法。本章将会讨论一些基于图像处理技术的不同的表示方法。比如,high-dynamic range rendering(高动态光照渲染),motion blur(动态模糊),以及depth of field(景深)相关的post-processing效果。
- 第11章,Non-Photorealistic Rendering。试图使一个场景看起来更加逼真只是众多渲染样式中的一种。本章主要讨论其他的渲染样式,比如cartoon shading(卡通着色)。
- 第12章,Polygonal Techniques。Geometric数据的来源非常广泛,有时需要修改这些数据以加快速度更好的进行渲染。本章主要讨论polygonal data(多边形数据)并对多边形进行整理简化。此外,还会讨论更精细的表示多边形的方式,比如triangle strips,fans以及meshes。
- 第13章,Curves and Curved Surface(曲线和曲面)。使用硬件渲染几何图形从根本上来说是绘制点,线,多边形。只要在质量和渲染速度之间保持平衡,使用越复杂的曲面可以产生更精致的画面以及更光滑的表面。
- 第14章,Acceleration Algorithms(加速算法)。完成了渲染之后,我们开始讨论如何加快渲染速度,本章主要讲解各种culling(剔除)方式,以及level of detail(LOD)渲染方法。
- 第15章,Pipeline Optimization。一旦某个应用程序使用高效的渲染加速算法运行,使用各种优化技术可以使该程序渲染速度更快。本章主要讨论如何找到性能的瓶颈,并解决性能问题。另外还讨论了multiprocessing渲染技术。
- 第16章,Intersection Test Mothods。在执行渲染,用户交互以及碰撞检测的过程中,intersection testing(相交测试)是非常重要的。本章提供了一种广泛用于几何相交测试的最高效的算法,in-depth coverage。
- 第17章,Collision Detection(碰撞检测)。大多数实时渲染应用的一个关键要素是判断两个物体是否发生碰撞。对于这个快速发展的领域,本章提出了一些高效的算法。
- 第18章,Graphics Hardware(显卡)。在前面的章节中,我们已经讨论了GPU加速算法,本章我们将重点关注显卡的如下部分:color depth(颜色深度),frame buffers(帧缓存)以及基础架构类型。另外讲述了一些具有代表性的图形加速器的研究案例。
- 第19章,The Future。猜想一下未来的实时渲染技术。
此外,本书的附录中还讲述了linear algebra(线性代数)和trigonometry(三角函数)。
1.2 Notation and Definitions(常用数学记号及定义)
首先,我们将讲解在本书中使用的数学记号。关于本节使用的大量记号的全面讲解请阅读附录A。
1.2.1 Mathematical Notation(数学记号)
表格1.1中总结了我们将要使用的大部分数学记号。部分概念将会在本节进行描述。
Type | Notation | Examples |
---|---|---|
angle(角度) | lowercase Greek(小写希腊字母) | αi,ϕ,ρ,η,λ242,θ |
scalar(标量) | lowercase italic(小写斜体) | a,b,t,uk,v,wij |
vector or point (向量,点) | lowercase bold(小写粗体) | a,u,vs,h(ρ),hz |
matrix(矩阵) | capital bold (首字母粗体) | T(t),X,Rx(ρ) |
plane(平面) | π : a vector and a scalar(一个法向量及一个标量) | π:n⋅x+d=0π1:n1⋅x+d=0 |
triangle(三角形) | △ 3 points (3个点) | △v0v1v2,△cba |
line segment (线段) | two points(2个点) | uv,aibj |
geometric entity(几何实体) | capital italic(首字母斜体) | AOBB,T,BAABB |
表格1.1 Summary of the notation used in this book.
角度和标量来自
R
(欧几里德空间),也就说这两个记号值为实数。向量和点记号以小写的粗体字母表示,并通过如下分量形式进行访问:
这是一种列向量的表示方式,常用于计算机图形学中。在本书的某些地方我们会使用行向量的表示形式 (vx,vy,vz) ,而不是更合理的列向量形式 (vxvyvz)T ,仅仅是因为行向量形式更容易阅读。
在homogenous coordinates(齐次坐标系,见附录A.4)中,使用
v=(vxvyvzvw)T
表示一个坐标,相应的
v=(vxvyvz0)T
表示一个向量,
v=(vxvyvz1)T
表示一个坐标点。有时我们只使用三维向量和坐标点,但是要避免在向量和坐标点的类型表示之间变得模糊不清。对于矩阵运算,使用同样的记号表示向量和坐标点是非常有利的(见第4章的变换运算,以及附录A.4的齐次记号)。在某些算法中,使用数字索引如
v=(v0v1v2)T
的表示形式更方便,而不是使用
x,y,z
索引。这些表示向量和坐标点的方式同样适用于二维向量;在这种情况下,只是简单地忽略一个三维向量的最后一个分量。
接下来我们更详细地讲解矩阵。常用的矩阵大小分别是
2×2
,
3×3
和
4×4
。首先让我们回顾一下
3×3
矩阵
M
的访问方式,对该方式进行简单地扩展就可以用于访问任意大小的矩阵。矩阵
M
的(标量)元素使用
mij,0≤(i,j)≤2
表示,其中
i
表示行号
另外如公式1.3所示,对于一个 3×3 的矩阵,可以使用以下记号把向量从矩阵 M 中把向量独立出来: m,j 表示第 j 列向量,
平面的表示方式为
π:n⋅x+d=0
,这种方式包含了平面的数学方程式,平面的法向量
n
和标量
d
。其中法向量描述了平面的朝向。对于更普遍的表面(比如曲面),法向量描述了表面上某个特定点的方向。而对于平面,同一个法向量可以用于表示平面上所有点的方向。通常使用数学记号
使用三个坐标点 v0,v1,v2 可以定义一个三形,并表示为 △v0v1v2 。
表格1.2中列出一些其他的数学运算符和对应的记号。其中,dot(点积),cross(叉积),determinant(行列式),length(长度)运算符在附录A进行了详细讲解。
Num | Operator | Description |
---|---|---|
1: | ⋅ | dot product(点积) |
2: | × | cross product(叉积) |
3: | vT | 向量 v 的转置 |
4: | ⊗ | 分段向量乘法 |
5: | ⊥ | 正交点积一元运算符 |
6: | |⋅| | 矩阵的行列式 |
7: | |⋅| | 标量的绝对值 |
8: | ∥⋅∥ | 参数的长度(模) |
9: | n! | 阶乘 |
10: | (nk) | 二项式系数 |
表格1.2 Notation for some mathematical operators.
transpose(转置)运算符用于把一个列向量转换成行向量,反之亦然。因为可以使用压缩的形式把列向量写到一个文本块中,如
v=(vxvyvz)T
。第4个操作符需要进一步讲解:
u⊗v
表示向量
(uxvxuyvyvzvz)T
,即向量
u
的
i
分量和向量
另外需要注意 0!=1 。
第10个操作符是一个二项式系数,定义为公式1.5所示:
进一步我们可以把平面
x=0
,
y=0
和
z=0
称为coordinate planes(坐标平面)或axis-aligned planes(轴对齐平面)。同时,把轴
ex=(100)T
,
ey=(010)T
和
ez=(001)T
称为main axes(主轴)或main directions(主方向),通常对应为
x
轴,
记号
在本书中经常会用到C语言数学库函数 atan2(y,x) ,因此专门在这里讲解一下。该函数是对三角函数 arctan(x) 的扩展。这两个函数主要不同的地方是值域不同,分别为 0≤atan2(y,x)<2π 和 −π2<arctan(x)<π2 ,另外在 atan2(y,x) 函数中还有一个额外的参数。要避免该参数值为0,以免产生除以0的运算,即执行 x=y/x 时避免 x=0 。
Num | Function | Description |
---|---|---|
1: | atan2(y,x) | two-value arctangent |
2: | cos¯¯¯¯¯(θ) | clamped cosine |
3: | log(n) | natural logarithm of
n
( |
表格1.3 Notation for some specialized mathematical functions.
第2个要介绍的函数是clamped-cosine(约束的余弦函数) cos¯¯¯¯¯(θ) ,该函数是为了使shading公式不至于太难阅读。如果正常的余弦函数值小于0,则clamped余弦函数就会返回0值。
第3个函数是 log(n) ,在本书中该记号表示自然对数 loge(n) ,而不是底为10的对数 log10(n) 。
此外,我们使用右手坐标系(见附录A.2),因为这是计算机图形学领域表示三维几何的标准坐标系。
颜色值使用一个包含3个元素分量的向量表示,比如
(red,green,blue)
,其中每一个元素分量都介于范围
[0,1]
之间。
1.2.2 Geometrical Definitions(几何表示)
大部分显卡使用的基本渲染图元(也称为绘制图元)分别是点,线和三角形。
除了点,线和三角形,唯一的例外是Pixel-Planes,可以直接绘制球体,NVIDIA NV1芯片可以直接绘制椭圆体。
在本书中,我们把几何体的集合称为模型或物体。把渲染环境中包含的全部模型的集体称为场景。此外,在场景中还可以包含材质描述,光照,以及观察规范。
物体有多种表示形式,比如一辆汽车,一幢大楼,甚至是一个线条。在实际工作过程中,通常使用一组绘制图元表示一个物体,但是凡事都有例外情况;一个物体还可能包含一种更高级的几何表示,比如贝塞尔曲线或曲面,细分表面等等。另外,物体也可以由其他的物体组成,例如,一个汽车模型的车门可以称为一个物体或都汽车的子集。
Further Reading and Resources
我们能够提供的最重要的参考资源是本书的配套网站:http://www.realtimerendering.com。该网站上包含了最新的信息,以及每一章相关的网站。随着时间的进展实时渲染领域也在不断发展。本书中我们会尽量重点讲解那些很可能不会过时的概念和技术。在网站上,我们会展示有关现今的软件开发人员的信息,并时刻保持最新的内容。