Real-Time Rendering 4th Chapter 1 Introduction 简介 转载
实时渲染主要关注如何快速的在计算机上渲染出图像。是计算机图形学中最热门的领域。图像渲染到屏幕后,会影响到观察者的行为,而观察者的行为又会影响到接下来的渲染。这个反馈和渲染速度非常快,观察者不会看到单独的图像,而是沉浸到这一动态过程中。
使用每秒帧数(fps)或者(Hz)来衡量图像的渲染频率。一秒一帧的频率下,毫无交互性可言,用户感觉自己的操作需要很长时间。在6fps的频率下,有一点交互性。当一个应用达到15fps就可以称之为实时了,用户会聚集到操作和反馈。由于用户的限制,超过72fps之后,用户就很感知更高的频率。
当用户观看超过60fps的图像渲染时不会有任何延迟感,更高的帧率只不过减少用户操作的反馈时间而已。在某些强操作交互中,即使15ms的延迟也会影响到用户体验。当然我们这里主要讨论的是实时渲染而不是交互性。如果反应速度是关键因素,能快速响应用户操作并在屏幕上呈现结果的应用就是合格的。实时渲染一般指的是三维物体的渲染。
交互性和三维空间不是实时渲染的关键条件,而是一种第三方部件–图像加速硬件(显卡)。在工作站上的专用的三维图像渲染硬件已经出现了很多年,不过这种硬件在消费级领域出现时间不长。公认的第一次出现在消费级领域的硬件是1996年出现的3Dfx Voodo 1。随着市场的快速增长,这种三维图像渲染硬件已经成为PC的标配了。不仅仅是用在实时渲染领域,它也用于很多的实时应用。
过去几年,图形硬件引发了交互图形学的爆发式增长。我们主要研究加速渲染速度和提高图像质量,并且描述加速算法和图像API的特性和优缺点。我们不会深入每个主题,而是介绍概念和术语,介绍每种方法的使用场景,提供更深沉次信息的入口。我们希望我们的尝试可以让你理解这一领域,让你觉得值得花费时间在本书上。
1.1 内容预览
下面是每个章节的简介。
第二章,渲染管线,本章描述实时渲染的核心 - 渲染管线,一种机制接受场景描述并转换为我们所见图像。
第三章,渲染单元,现代GPU实现实的时渲染的固定管线功能和可编程功能。
第四章,变换,变换是操作位移、旋转、缩放和相机的变化的工具。
第五章,外观,本章开始讨论材质、光照和它们之间的结合应用以实现具有真实感的外观。还会覆盖到外观相关的反走样和伽马校正。
第六章,纹理贴图,实时渲染中最重要的工具,用来实现在表面上显示图像。本章主要讨论这种技术的机制,和各种各样的应用方式。
第七章,高级着色,本章讨论高级着色的理论和实践,主要是如何表示材质和使用光源。
第八章,区域和环境光,讨论更多的光源类型和算法。
第九章,全局光照,阴影、反射、折射、光线跟踪、预计算光源和环境光遮罩等技术。
第十章,图像效果,使用多边形并不是最快的方式来表现光晕、火等效果。 本章主要讨论基于图像的效果。各种后处理特效,比如动态高光、运动模糊、景深。
第十一章,非真实渲染,本章讨论卡通渲染。
第十二章,多边形技术,几何数据来源范围很广,有时为了渲染速度回修改几何数据。本章讨论多边形数据的清理和简化操作。还会介绍一些压缩表示方式,例如三角形带,fans和网格。
第十三章,曲线曲面,硬件最终处理的还是点、线和多边形。一些复杂的表面会在质量和渲染速度上取得一些平衡,以及更好的压缩表示和光滑曲面的生成。
第十四章,加速算法,主要包含空间裁剪和LOD。
第十五章,管线优化,加速算法可以让应用更加流畅。本章主要研究如何找到瓶颈并处理瓶颈。还会介绍多遍渲染。
第十六章,相交测试,相交测速对渲染、用户交互和碰撞检测来说十分重要。本章主要介绍一系列有效的算法来判别几何体之间是否相交。
第十七章,碰撞检测,对某些实时应用来说,找出两种对象是否相交十分关键。本章会介绍一些这个领域中的有效算法。
第十八章,图形硬件,之前的章节讨论过GPU加速算法,本章讨论其他部分,例如颜色、深度、帧缓存等基础结构类型。研究一些图形加速例子。
第十九章,未来
附录中有一些线性代数和三角函数相关知识。
1.2 符号和定义
先讨论本书所使用的数学符号,附录A详细的解释了本章的一些术语。
1.2.1 数学符号
表1.1总结了我们所使用的数学符号。这里会详细的讨论某些概念。
表1.1
类型 | 符号 | 示例 |
---|---|---|
角度 | 小写希腊字母 | αi,ϕ,ρ,η,γ242,θαi,ϕ,ρ,η,γ242,θ |
标量 | 小写斜体 | a,b,t,uk,v,wija,b,t,uk,v,wij |
向量或者点 | 小写黑体 | a,u,vs,h(ρ),hza,u,vs,h(ρ),hz |
矩阵 | 大写字母 | T(t),X,Rx(ρ)T(t),X,Rx(ρ) |
平面 | ππ:向量+标量 | π:n⋅x+d=0, π1:n1⋅x+d1=0π:n⋅x+d=0, π1:n1⋅x+d1=0 |
三角形 | Δ3Δ3 | Δv0v1v2,ΔcbaΔv0v1v2,Δcba |
线段 | 两点 | uv,aibjuv,aibj |
几何实体 | 大写斜体 | A0BB,T,BAABBA0BB,T,BAABB |
角度和标量都是使用实数R来表示,向量和点使用加黑的小写字母来表示,如v=⎛⎝⎜vxvyvz⎞⎠⎟v=(vxvyvz)。这一列向量形式,计算机图形学中最常用的方式。不过有时候本书使用(vx,vy,vz)(vx,vy,vz)来表示正确的向量(vx,vy,vz)T(vx,vy,vz)T,因为前者容易阅读。
齐次坐标系中使用v=(vx,vy,vz,vw)Tv=(vx,vy,vz,vw)T来表示点或者向量,v=(vx,vy,vz,0)Tv=(vx,vy,vz,0)T表示向量,v=(vx,vy,vz,1)Tv=(vx,vy,vz,1)T表示点。有时候我们使用三元素的向量或者点,但是我们尽量少的避免使用这种三元素方式,以免带来混淆。对矩阵操作来说,使用齐次坐标会非常方便,因为齐次坐标统一了向量和点的表示方式。在某些算法中,使用数字下标比x,y,z来的方便一些,比如v=(v0,v1,v2,)Tv=(v0,v1,v2,)T。这些规则对二元素的向量也适用,只不过忽略了最后一个元素而已。
矩阵要稍微复杂一点。常见的为2x2,3x3和4x4矩阵。我们主要介绍一下3x3矩阵M的访问方式,可以轻易的推广到其他尺寸。矩阵M的元素表示为mij, 0≤(i,j)≤2mij, 0≤(i,j)≤2,i 表示行,j 表示列。如公式1.2所示:
M=⎛⎝⎜m00m10m20m01m11m21m02m12m22⎞⎠⎟(1.2)(1.2)M=(m00m01m02m10m11m12m20m21m22)
如公式1.3的3x3矩阵所示的符号是用来矩阵中的向量,m,jm,j表示矩阵的第j列,mimi表示矩阵的第i行。和向量与点的访问方法一样,也可以使用下表x,y,z,w来访问。
M=(m,0m=,1m,2)=(mxmymz)pmatrix=⎛⎝⎜mT0m1∗TmT2⎞⎠⎟(1.3)(1.3)M=(m,0m=,1m,2)=(mxmymz)pmatrix=(m0Tm1∗Tm2T)
使用π:n⋅x+d=0π:n⋅x+d=0来表示平面,这是点法式,使用法线向量n和标量d表示。法线是一个向量,表示平面的朝向。一般来说(曲面),法线描述的是平面上某一点的方向。对平面来说,所有点的法线都相同。ππ是表示平面的常用符号。平面ππ将空间分为两部分,分别是正半空间,当π:n⋅x+d>0π:n⋅x+d>0,和负半空间π:n⋅x+d<0π:n⋅x+d<0。其他点都位于平面上。
使用三点v0,v1,v2v0,v1,v2来表示三角形,使用符号Δv0v1v2Δv0v1v2来表示。
表1.2列举常见的数学操作及其符号表示。附录A还包含了点乘、叉乘、行列式和取模。转置操作将列向量变换为行向量,反之亦然。故此列向量可以表示为v=(vx,vy,vz)Tv=(vx,vy,vz)T。第4个操作表示u⨂vu⨂v表示向量v=(uxvx,uyvy,uzvz)Tv=(uxvx,uyvy,uzvz)T,结果为u的每个一分量和v对应的分量相乘。这种操作主要用于颜色向量。第5个操作由Graphics Gems IV引入,是一个二维向量的一元操作符。表示向量v=(vx,vy)Tv=(vx,vy)T的垂直向量v⊥=(−vy,vx)Tv⊥=(−vy,vx)T。我们使用|a|表示标量a的绝对值,而|A|表示矩阵A的行列式。有时候也会使用|A|=|a b c|=det(a,b,c)|A|=|a b c|=det(a,b,c),a,b,c是矩阵A的列向量。第9个操作是阶乘,定义如下,0!=10!=1:
n!=n(n−1)(n−2)⋅⋅⋅3⋅2⋅1(1.4)(1.4)n!=n(n−1)(n−2)⋅⋅⋅3⋅2⋅1
第十个操作符,二项式因子,定义如下1.5:
(nr)=n!k!(n−k)!(1.5)(1.5)(nr)=n!k!(n−k)!
更进一步来说,我们称x=0,y=0,z=0x=0,y=0,z=0为坐标系平面。轴ex=(1 0 0)T,ey=(0 1 0)T,ez=(0 0 1)Tex=(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。
本书经常使用C函数atan2(y,x)。这是标准函数arctan(x)的扩展。两者之间的区别在于,−π2<arctan(x)<−π2−π2<arctan(x)<−π2,0<arctan(x)<2π0<arctan(x)<2π,后面的函数需要一个额外的参数。这个额外的参数不能为0。(atan2(y,x)表示向量(x,y)和x轴之间的角度)
表1.2
n | 操作符 | 描述 |
---|---|---|
1 | ⋅⋅ | 点积 |
2 | ×× | 叉乘 |
3 | vTvT | 转置 |
4 | ⨂⨂ | |
5 | ⊥⊥ | |
6 | |⋅||⋅| | 矩阵的行列式 |
7 | |⋅||⋅| | 绝对值 |
8 | ||⋅||||⋅|| | |
9 | n!n! | 阶乘 |
10 | (nr)=n!k!(n−k)!(nr)=n!k!(n−k)! | 二项式 |
11 | atan2(y,x)atan2(y,x) | 点(x,y)到原点的向量和X轴之间的夹角(幅度) |
12 | cos(θ)¯¯¯¯¯¯¯¯¯¯¯¯¯cos(θ)¯ | max(0,cos(θ))max(0,cos(θ)) |
13 | log(n)log(n) |
.
Clamped-cosine,cos(θ)¯¯¯¯¯¯¯¯¯¯¯¯¯cos(θ)¯是为了介绍着色公式的时候简化公式。如果cos(θ)cos(θ)小于0,cos(θ)¯¯¯¯¯¯¯¯¯¯¯¯¯cos(θ)¯就为0。
log(n)log(n)表示自然对数,等价于loge(n)loge(n),不是以10为地的对数log10(n)log10(n)。
我们使用右手坐标系,因为这是计算机图形中三维几何的标准坐标系。
使用三元素(red, green, blue)来表示颜色,每个元素在范围[0,1]内。
1.2.2 几何定义
图形硬件使用的最基本图元为点,线和三角形。
贯穿本书,我们称基本图元的集合为模型或者对象。场景是模型的集合,包含场景中所有需要渲染的对象。场景还包含材质,灯光和观察者。
例如对象可以为车、建筑、甚至于直线。实际中,一个对象包含大量的渲染图元,但也不是总是这样。一些对象有更高抽象层次的集合表示,比如所贝塞尔曲线和曲面,细分表面等等。对象也可以包含其他对象,我们称车门为车的子集。