实时渲染是指在计算机上快速的显示出图像,是计算机图形学中最具有交互式的领域。在屏幕上显示出图像,观察者的行为和反应,以及会做出什么样的反馈会影响接下来生成的内容。由于这种反应和渲染的循环的变换的频率足够快,所以观察者看到的不是一张张图像而是沉浸在一系列动态的变化中。
图像的变换的频率是通过每秒的帧数或者每赫兹的帧数来测量的。每秒一帧的速率,几乎没有互动性的感觉,用户痛苦的意识到每一张新图像的更新,每秒6帧的速率的时候,互动性的感觉就开始慢慢增加。视频游戏的目标一般是每秒30帧,60帧,72帧或者更高的FPS,这些速率下,用户专注行为和反应。
电影放映机以每秒24帧的速率显示动画,但是用一个快门系统将每个画面展示二到四次,去避免画面闪烁。这种刷新速率和展示速率不同,用赫兹来表示。 一个快门将一个画面显示三次,代表刷新频率为每赫兹72帧。液晶显示器的刷新速率也和展示频率分开。在屏幕上以每秒24帧的速率看图像可以被接收,但是更高的速率对于缩小反应时间是很重要的。只要15毫秒短暂的延迟就会减慢并影响交互。例如,虚拟现实头戴显示设备经常需要每秒90帧的速率来使得延迟最小化。
实时渲染不仅仅是交互性。如果速率是唯一的指标,任何可以快速响应用户指令并且在屏幕上渲染图像的应用都是合格的。实时渲染意味着产生三维图像。
交互性和三维空间的某种连接感对于实时渲染来说是很重要的条件,但是还有三分之一的元素是成为他定义的一部分:图像加速硬件。许多人认为1996年推出的3Dfx Voodoo 1卡是消费者级三维图形的真正开始。随着市场的快速发展,每台电脑,平板,手机都内置了图像处理器。如图1.1,1.2是在硬件加速的支持下实时渲染可以达到的优秀的结果。
图像硬件的发展推动了计算机图形交互领域的爆发性发展。我们将会把重点放在提高速率和图像质量的方法上,同时还会描述加速算法和图形API的特点和局限性。我们无法深入探讨每一个主题,所以我们的目标是呈现关键概念和术语,解释该领域的最可靠和实用的算法,并且提供能获得更多信息的地方的指引。我们希望我们能够向您证明这本书是值得花时间和精力去阅读的,能够理解图形学这一领域。
首先,我们将解释本书用到的数学符号。在本章节中对用到的术语进行详细彻底的解释。可以在realtinereadering.com获得本书的线性代数附录。
表1.1概括了我们用到的大多数数学符号。一些概念会在这里进行详细的解释。 注意到表中的规则有一些例外,主要是在文献中已经用来表示着色方程,例如, L L L代表辐射, E E E代表辐照度, σ s σ_s σs代表散射系数。
角度和标量取自R,即它们是实数。矢量和点用粗体小写字母表示, 组件以这个形式表示,
即列向量形式表示,在文章中的某些地方我们用 ( v x , v y , v z ) (v_x,v_y,v_z) (vx,vy,vz) 表示而不是 ( v x , v y , v z ) T (v_x,v_y,v_z) ^T (vx,vy,vz)T,因为前者这种形式更容易阅读。
齐次坐标系中,使用四个值表示坐标, v = ( v x , v y , v z , v w ) T v = (v_x,v_y,v_z,v_w)^T v=(vx,vy,vz,vw)T,一个向量可以表示成 v = ( v x , v y , v z , 0 ) T v = (v_x,v_y,v_z,0)^T v=(vx,vy,vz,0)T或者 v = ( v x , v y , v z , 1 ) T v = (v_x,v_y,v_z,1)^T v=(vx,vy,vz,1)T。有时候我们只用三个值来表示点或者向量,但我们要避免使用这种三元素表示坐标的形式,因为会带来歧义。对于矩阵操作,向量和点使用相同的符号是很有优势的,更多信息参见第四章坐标变换。在某些算法中,使用数字索引代替x、y和z会很方便,例如 v = ( v 0 , v 1 , v 2 ) T v=(v_0,v_1,v_2)^T v=(v0,v1,v2)T。我们只需忽略三元素向量的最后一个分量,所有这些向量和点的规则也就适用于两个元素向量。
关于矩阵这里多做一点解释,我们通常使用的矩阵大小是2x2,3x3,4x4,我们使用3X3大小的矩阵M为例,并且很容易扩展成其他尺寸的矩阵。矩阵M的元素表示为 m i j mij mij ( 0 < = ( i , j ) < = 2 ) (0<=(i,j)<=2) (0<=(i,j)<=2), i i i表示行, j j j表示列,如公式1.1所示
下面在方程1.2中的符号用来区分向量和矩阵M: m , j m,j m,j代表第 j j j列向量, m i , mi, mi,代表第 i i i行向量(以列向量形式)。和表示点或者向量一样,可以使用 x , y , z x,y,z x,y,z表示的列向量,有时候还会有w,如果这样更方便的话: 平面表示为π: n ⋅ x + d = 0 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 n·x+d<0 n⋅x+d<0,所有其他的点都在这个平面上。
三角形可以用三个点来表示, v 0 v_0 v0, v 1 v_1 v1, v 2 v_2 v2,表示为 △ v 0 v 1 v 2 △v_0v_1v_2 △v0v1v2。
表1.2展示了一个其他的数学运算符和符号。点乘,叉乘,行列式和长度运算符在realtimerendering.com下载的线性代数附录中有解释。转置运算符将列向量变成行向量,反之亦然。因此列向量可以使用压缩的形式写在文本中,表示成 v = ( v x , v y , v z ) T v = (v_x,v_y,vz)^T v=(vx,vy,vz)T,在Graphics Gems IV中引入的运算符4是二维向量上的一元运算符。让这个运算符在向量 v = ( v x , v y ) T v=(v_x,v_y)^T v=(vx,vy)T上工作得到一个垂直于v的向量,即 v ⊥ = ( − v y , v x ) T v^⊥=(−v_y,v_x)^T v⊥=(−vy,vx)T。我们用|a|表示标量的绝对值,同样 ∣ A ∣ |A| ∣A∣表示矩阵 A A A的行列式。有时,我们也使用 ∣ A ∣ = ∣ a b c ∣ = d e t ( a , b , c ) |A| = |a b c| = det(a,b,c) ∣A∣=∣abc∣=det(a,b,c), a , b , c a,b,c a,b,c表示矩阵 A A A的列向量。 运算符8和9是限制性运算符,通常用于着色计算。运算符8将负值限制为0: 运算符9限制在0和1内: 阶乘用下面的式子表示,并且 0 ! = 1 0!=1 0!=1: n ! = n ( n − 1 ) ( n − 2 ) ⋅ ⋅ ⋅ 3 ⋅ 2 ⋅ 1 n!= n(n−1)(n−2)···3·2·1 n!=n(n−1)(n−2)⋅⋅⋅3⋅2⋅1
第十一个算符,二项式因子,如等式1.6所示: 我们把平面 x = 0 x=0 x=0, y = 0 y=0 y=0, z = 0 z=0 z=0称之为坐标平面或者轴对齐平面,轴 e x = ( 1 , 0 , 0 ) T e_x=(1,0,0)^T ex=(1,0,0)T, e y = ( 0 , 1 , 0 ) T e_y=(0,1,0)^T ey=(0,1,0)T, e z = ( 0 , 0 , 1 ) T e_z=(0,0,1)^T ez=(0,0,1)T称为主轴或者主要方向,分别叫做x轴,y轴,z轴。 这组轴通常叫做标准基,除非有特殊标明,我们将用正交基(由互相垂直的单位向量组成)。
如果要表示范围在 a a a, b b b之间包括 a a a和 b b b的所有数用 [ a , b ] [a,b] [a,b]表示,如果要表示范围在 a a a, b b b之间的所有数用 ( a , b ) (a,b) (a,b)表示,如果用 [ a , b ) [a,b) [a,b)就表示范围在 a a a, b b b之间的所有数,包括 a a a但是不包括 b b b。
值得注意的是,在本文中经常使用C-数学函数 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)。它是数学函数 a r c t a n ( x ) arctan(x) arctan(x)的扩展。它们的主要区别是 − π / 2 < a r c t a n ( x ) < π / 2 −π/2<arctan(x)<π/2 −π/2<arctan(x)<π/2, 0 ≤ a t a n 2 ( y , x ) < 2 π 0≤atan2(y,x)<2π 0≤atan2(y,x)<2π,并且后者添加了一个额外的参数。 a r c t a n arctan arctan的一个常见用法是计算 a r c t a n ( y / x ) arctan(y/x) arctan(y/x),但是当 x = 0 x=0 x=0时,除数就会是0。 a t a n 2 ( y , x ) atan2(y,x) atan2(y,x)的额外参数避免了这种情况。
在本书中, l o g ( n ) log(n) log(n)总是指自然对数 l o g e ( n ) log_e(n) loge(n),而不是以10为底的对数 l o g 10 ( n ) log10(n) log10(n)。
我们使用右手坐标系,因为这是计算机图形学领域中三维几何的标准坐标系。
颜色由三个元素向量表示,例如(红、绿、蓝),其中每个元素的范围是 [ 0 , 1 ] [0,1] [0,1]。
几乎所有图形硬件使用的基本渲染图元(也称为绘图图元)是点、线和三角形。
在本书中,我们将把几何实体集合称为模型或对象。一个场景是模型的集合,包含要渲染的环境中的所有内容。场景还可以包括材质描述、光照和观察者。
模型可以是一辆车,一个建筑甚至是一条线。实际上,一个模型通常是一系列绘图图元的集合,但并非总是如此;一个对象可能具有更高的几何表示形式,例如贝塞尔曲线或曲面,或细分曲面等等。此外,对象可以由其他对象组成,例如,汽车对象包括四个门对象、四个车轮对象等。
根据公认的计算机图形用法,在本书中,源自“着色”、“着色”和相关词语的术语用于指代两个不同但相关的概念:计算机生成的视觉外观(例如,“着色模型”、“着色方程,“卡通着色”)或渲染系统的可编程组件(例如,“顶点着色器”、“着色语言”)。这两种都可以在本书中学习到具体的含义。