Real-Time Rendering Chaper 2 translation

图片貌似加不上来。这是我专业英语的作业,没事就翻出来了。。本人CET4可还没过的额。。。不翻的烂了请见谅。。。。                             

                               第二章 图形渲染管线

 

“链条的牢固水平取决于它最单薄的环节。”

                                                                           Anonymous

在这章一开始我们将会介绍称为图形渲染管线(graphics rendering pipeline)的组成,其中图形渲染管线也被简称为管线。管线的功能主要有生成、渲染、二维图像、获取虚拟摄影机、三维对象、光源、着色方程、纹理等。在实时渲染中渲染管线是最主要的工具。在图2.1中描绘了运用管线的过程。对象的位置、形状以及在环境中的特征与在这环境中摄影机的位置都由它们的几何所决定。一个对象的外貌是由它们的材质属性、光源、纹理与着色模式所影响的。

 

2.1.在左图中,在四棱锥顶端上固定了一个虚拟摄影机(在四条线的交点上)。只有在视见体积中的物体才能被渲染。透视投影渲染图像(正如该案例),视见体积是一个平截头体,也就是一个截得的矩形底部。右图所示的就是摄影机所“看见”的场景。值得注意的是左图中的红色圆环没有在右图中渲染出来的,那是因为它的位置不在视见体积中。而且左图中的扭曲蓝色棱柱经过裁去了椎体的顶部。

    在渲染管线中的不同阶段,我们即将对此进行讨论与解释,其中主要集中于功能的介绍而非实现。细节的实现除了是程序所不能控制的元素外,其余的我们将会留在后面的章节所讨论。例如,在画线中顶点数据的格式、颜色、样式、是否有深度暗示,这些都是非常重要的,无论是采用森汉姆的画线算法(Bresenhams line-drawing algorithm)[142]还是采用双向均匀算法(sysmmetric double-step algorithm)[1391]进行画线。通常这些管线都是在不可编程的硬件上实现的,这是为了尽可能的提高与优化执行效率。基本绘画的细节与填充算法会在罗杰斯(Rogers)一书[1077]中深入讨论。虽然我们可能很少的去控制那些底层硬件、算法、编码方式时,却有效的影响了绘图的速度与质量。

 

2.1 架构

 

在这物质世界,管线的概念被表现为不同于工厂中滑雪缆车装配线的许多形式。它也被应用在了图像渲染上。

    一个管线包括了若干个阶段[541]。例如在油管中,油管中第一部分的油不能移动到第二部分,除非第二部分的油已经移动到了第三部分,第四部分也是如此。这就意味着管线的速度是由其中最慢的阶段所决定的,无论其他的阶段是多么的快。

    理论上来说,在非管线系统中把管线分成n个阶段就相当于把速度加快了n倍。这种加速现象就是采用管线技术的主要原因。例如,一个滑雪缆车上只有一个座位的效率是很低的,那么就应该加上与上山滑雪人的数量相对应的座位。管线的各个阶段是并行执行的,但是只有完成了其中最慢的阶段其余阶段才能运行。例如,如果一辆车的方向轮安装阶段需要3分钟,而其余阶段只需要2分钟,那么效率最快的完成一辆也需要3分钟时间,因为其余的阶段在方向轮安装完成之前都必须闲置1分钟。在这管线中方向轮安装阶段是一个瓶颈,因为它决定了整体的生产速度。

    这种管线架构也被应用在实时计算机图形学中。在概念上可以把实时渲染粗略的划分为3个阶段—程序、几何、光栅化,如图2.2。这种管线渲染引擎架构是计算机图形学的核心,因此必不可少的会在随后的章节进行讨论。其中的每一个阶段通常自身也是进行管线操作的,这就意味着它们会包含许多子阶段。我们在概念上区分下这些阶段(程序、几何、光栅化)、函数阶段与功能阶段。功能阶段都有需要执行的任务,但是在管线这中却没有指定以何种方式去执行。管线阶段,另一方面上,是与其他的管线操作并行执行的。管线阶段也可能为了满足高性能的需要而采用并行化。例如,一个几何阶段可能被分为五个功能阶段,但是它的图形实现而是由所分成的管线阶段所决定的。实现可能是两个功能阶段结合成一个管线阶段,也可能是由耗时的功能阶段分成许多并行的管线阶段

 

2.2.这是渲染管线的基本结构,它由3阶段组成:程序、几何学和光栅化。其中的每一个阶段的内部也是管线,就像几何学阶段,或是在一定程度上是并行的,例如光栅化阶段。在这个例子中,程序阶段是一个单一的程序,但是这是阶段也能进行流水化操作或是并行操作。

    渲染速度、图像的更新频率是由管线阶段中最慢的阶段所决定的。而渲染速度可以由帧频(fps)所表示,他表示每秒中图像的渲染数量。它也能由赫兹(Hz)所表示,他的实质可以表示为1/秒,它表示更新的频率。应用程序在每帧的时间里经过复杂的计算生成出各种图像。帧频要么是用来表示某一帧的速率,要么是一段时间的平均速率。赫兹被用在硬件上面,比如按固定的频率显示图像。由于我们处理的是管线,因此我们不能将在管线上通过的所有我们想要渲染数据所花的时间一一加起来。当然,这是因为管线的结构,它的允许每一阶段并行的去执行。如果我们能找到在管线中最慢的阶段,并能测出数据通过这一阶段所用的时间,那么我们就能计算出它的渲染速度。假设,例如,这一瓶颈执行用时20ms(微秒),那么渲染的速度将是1/0.02=50Hz。然而,这只有在特定的更新速度的输出设备下;并且,输出速度较慢时才是正确的。在别的管线阶段中,整体的吞吐量(throughput)由渲染速度所替代。

例子:渲染速度。假设我们输出设备的最大更新频率是60Hz,而且渲染管线的瓶颈速度是所知的。计时显示这一阶段的执行时间是62.5ms。那么这一管线的速度就可以计算了。首先,忽略输出设备,我们得到最大的渲染速度是1/0.0625=16fps。其次,将它适应与输出设备的频率:60Hz意味着渲染速度就是60Hz60/2=30Hz,60/3=20Hz,60/4=15Hz,60/5=12Hz等等。这就是说我们认为渲染速度是15Hz,因为这是输出设备所能支持小于16Hz的最大速度。

    就像名称表示的,程序阶段是由程序所驱动的或是在通用CPUs上运行的软件所执行的。这些一般程序都是能够并行的多线程执行(threads of execution)的多核CPUs。这样就能够高效的运行各种在程序阶段的庞大任务。在程序阶段中,通常是在CUPs中执行如碰撞测试、重力加速算法、动画、物理模拟等许多任务。下一步就是几何阶段,在这阶段中处理变换、投影等操作。在这一阶段中将会计算该绘制什么、何如绘制与在哪里绘制。几何阶段往往是在可控制许多可编程核与固定操作的图形处理单元(GPU)硬件下执行的。最后,在光栅阶段用前一阶段生成的数据与想要的任意的每个像素来绘制(渲染)图像。光栅阶段的完全是在GPU下执行的。这些阶段与他们的内部管线将在后面的三个节中进行讨论。更多关于何如在GPU下执行这些阶段的细节将在第三章中介绍。

   

2.2 程序阶段

 

因为程序阶段是在CPUs下执行的,因此开发人员能够完全控制它做什么。因此,开发人员能够完全的决定其执行与能进行随后的修改以提高执行效率。此处的改变也会影响随后阶段的执行。例如,程序阶段的算法与设置能够减少渲染三角形的数量。

    在程序阶段的最后,几何将交给几何阶段。他们都是由渲染图元组成的,比如,点、线与三角形,这些最后可能展现在屏幕上(或者无论你使用的何种输出设备)。这是程序阶段最重要的任务。

    在这阶段基于软件的执行结果不像几何阶段与光栅化阶段那样将其分成子阶段。但是,为了提高实行效率,在个阶段总是在多核处理器上并行执行。在CPU的设计上,这被叫做超标量体系(superscalar)结构,因为它能够在同一时间、同一阶段执行多种处理。在15.5章中将提到各种多核处理模式。

    在这阶段执行的一般是碰撞测试。经过两个对象的碰撞测试,可能会产生一个回应并送回给对象与力反馈设备。程序阶段也是响应输入的地方,例如键盘、鼠标、头盔显示器等。

依赖于这些输入设备,就可以实现各种不同的行为。包括纹理动画,动画变换以及其他阶段不执行的计算都会在这一阶段执行。例如分层视域剔除等加速算法也都在这实现。

 

2.3 几何阶段

 

几何阶段负责大量的边与顶点的操作。这一阶段可以进一步拆分为如下几个阶段:模型与观察变换,顶点着色,投影,剪裁,屏幕映射(图 2.3)。值得注意的是,对于实现而言,这些功能阶段既可以看成管线阶段,也可以不被看成管线阶段。一些情况下,一系列连续的功能阶段构成单一的管线阶段(与其他管线并行运行)。另一些情况下,功能阶段又能再拆分成许多小的管线阶段。

 

2.3. 几何阶段拆分成的一个功能阶段组成的管线。

 

    举个极端的例子, 在单核处理器上,运行一个包含整个渲染管线中所有阶段的软件,那么你就能说整体的管线是由一个管线组成的。当然这是在分级加速芯片与主板出现之前是这样生成图像的。另一极端,每个功能阶段都能分成许多小的管线阶段,而且每个管线阶段都能在特定的处理器核心元件上执行。

 

23.1 模型与观察变换

 

经过这阶段在屏幕上显示,一个模型变换成了不同的形状(spaces)或是坐标系(coordinate systems)。一开始,模型拥有它自己还没有经过任何变换的形状。每个模型都能将位置和方向与变换模型联系起来。当然对单一的模型经过一系列的模型变换也是可以的。也允许在同一屏幕中对同一模型的许多副本进行位置、方向、大小的变换,而且不用基本几何图形进行重复变换。

    模型的顶点与法向量会随着模型变换而改变。一个对象的坐标被称为模型坐标(model coordinates),当经过模型变换之后就用模型坐标将模型定位在了世界坐标(world coordinates)或世界空间(world space)中。世界空间是唯一的,经过需要的模型变换之后,所有的模型就放在一个相同的空间中。

    正如前面所说的,只有在摄影机所看得见中的模型才被渲染出来。摄影机也确定了世界空间中的位置与方向,用来确定所处的位置与方向。为了方便投影与裁剪,摄影机与所有的模型都经过观察变换。观察变换的目的是将摄影机定位在原点并将视角方向朝向z轴的负方向(y轴指向上边,x轴指向右边)。观察变换的真正位置与方向依赖于应用程序接口(API)来实现。因此这个空间就被称为摄影空间(camera space),更一般的也称为视野空间(eye space)。以一个例子的方式在图2.4中展示了观察变换对模型与摄影机的影响。模型变换与观察变换都由4×4矩阵来实现,这将是第四章的主题。

 

2.3.2 顶点着色

 

为了产生出真实的场景,不只满足于对形状的渲染与对象的位置,对象的外观也应该被模拟。外观的描绘包括每个物体的材质与任意光照在物体上的效果。材质与光照可以以多种方式由简单的颜色完美的描绘出物体的物理外观。

    这种由光照在材质上来决定效果的操作叫做着色(shading)。着色操作(shading equation)会对物体上的各个点进行计算。通常,一些计算是在几何阶段对模型的顶点进行操作,另一些可能是在对每个像素的光栅化中执行的。各种材质数据都保存在每个顶点中,例如点的位置、法向量、颜色、以及其他的着色计算所需要的数字信息。顶点着色的结果(颜色、顶点、纹理、坐标、其他各种着色数据)接下来会交给光栅化阶段进行修改。

    着色计算通常都在世界空间中考虑,在实际中,能方便的将相关的实体(如摄影机与光源)转换到别的空间(如模型或视野空间)并在那里执行计算。这样做的原因是如果在着色计算中的物体转换到相同的空间中,相关的光源、摄影机与模型的彼此关系都能被保存。

    着色会在本书的第三章、第五章中进行深入透彻的讨论。

 

2.3.3 投影

 

着色之后,渲染系统执行投影(projection)操作,该操作将视见体积变换成端点为(-1-1-1)与(1,1,1,)的单位立方体。单位立方体也叫做正规化可视空间(canonical view volume)。投影模型一般有正交(orthograghic)(平行(parallel))投影与透视(perspective)投影,如图2.5

    正交投影的视见体积通常是个矩形,而且正交投影将这个视见体积变换为单位立方体。正交投影的主要特征就是平行线经过变换之后还是互相平行的。这种变换是转化与缩放的结合。

    透视投影会有一点复杂。在这种投影类型中,离摄影机越远的物体在投影之后会显得更小。另外,平行线会交与地平线上。透视变换由此模拟了我们对物体大小的感觉。几何学上来说,视见体积是个裁成矩形底的椎体。这一椎体也转换成了单位立方体。正交投影与透视投影可以由4×4的矩阵所表示(见第四章),并且经过任一种变换之后,这样的模型就称作为定位在了规格化设备坐标(normalized device coordinates)中。

 

2.5. 左图是正交或是平行投影,右图是透视投影。

 

    虽然用矩阵将一个物体变换成另一物体也被我们称为投影,因为在展示之后,z轴坐标没有存放图像的生成信息。用这种方法,三维模型就投影成了二维。

   

2.3.4 裁剪

 

只有全部或部分在视见体积中的物体才会交给光栅化阶段将他们绘制到屏幕上。一个全部在视见体积的物体将交给下一个阶段。全都不在视见体积中的物体是不会通过的,因为他不会被渲染。那些一部分在视见体积中的物体需要经过裁剪。例如,一条直线的一个顶点在视见体积内而另一顶点在此之外就应该经过视见体积的裁剪。那么在视见体积外的顶点会被视见体积与线的交点所替代。用投影矩阵就意味着物体的转变是由单位立方体进行剪裁的。在剪裁之前做观察变换与投影的优点是为了使剪裁问题一致;物体总是由单位立方体裁剪。如图2.6展示了裁剪操作。除了视见体积的六个剪切面之外,用户可以另外定义物体的裁剪面。在646页图14.1中展示的这一类型的图片可以形象的剖面图(sectioning)。不像那些一般在程序执行单元执行中执行的几何阶段的前面几个阶段,裁剪阶段(与随后的屏幕映射极端)通常是在固定操作的硬件中执行的。

 

2.6. 在投影投影变换之后,只有在单位立方体内的物体(也就是在视见体积中的物体)才会继续去执行。因此,在单位立方体外的物体都会被抛弃,并且全在里面的物体会被保留。被单位立方体截断的物体会以单位立方体进行裁剪,就这样新的顶点生成了,而旧的顶点就被丢弃了。

 

2.3.5 屏幕映射

 

只有在视见体积中的物体才会进入到屏幕映射阶段,并且进入到这一阶段的坐标都还是三维坐标。每个物体的x轴与y轴坐标都会转变成屏幕坐标(screen coordinates)。屏幕坐标与z轴坐标一起被叫做窗口坐标(window coordinates)。假设将场景渲染在一个窗口中,它的最小角坐标是(x1y1),最大角坐标是(x2,y2),其中x1<x2y1<y2。然后屏幕映射就转变成了缩放操作。z轴坐标是不会影响这一映射的。新的x轴与y轴坐标就称为屏幕坐标。他们与z轴坐标(-1z1)一道交给光栅化阶段。屏幕映射操作如图2.7

 

2.7. 放在单位立方体中的物体经过投影变换之后,经过屏幕映射将他定位到屏幕上。

   

    一个困惑是如何将整形与浮点型的值与像素(纹理)坐标联系起来。DirectX 9 与他的以前版本都用以0.0为像素中心的坐标系,这意味着像素范围为[0,9]会覆盖到[-0.5,9.5)中。Heckert[520]介绍了些逻辑一致的方案。有一段用笛卡尔坐标表示的水平数组像素,他的最左边像素的浮点型坐标是0.0OpenGLDirectX 10与它的后续版本都采用这一方案。像素的中心在(0.5,0.5)。那么像素范围[0,9]就可以取值为[0.0,10.0)。简单的表示为

                            d = floorc),                         2.1

                            c = d + 0.5                           2.2

其中d是像素的离散指数(整型)c是像素的连续值(浮点型)。

    虽然所有的API都会自左向右经过像素定位,但在有些时候OpenGLDirectX在顶端与低端边缘的起点定位会有所不一致。OpenGL总喜欢以笛卡尔坐标系,左下角为最小值元素,而DirectX是以左上角作为最小值元素。这是因为每种的不同逻辑,并不能正确的回答他们的不同。举个例子,在OpenGL中(0,0)作为图像的最下角,而DirectX是左上角。DirectX将顶端变成底端的原因是:微软窗口用这一坐标系,用这一方向读取,并且许多图像文件格式用这种方式存储他们的缓冲区。关键点是他们存在的不同并注意从一个API转移到另一个。

 

24 光栅化阶段

 

经过变换与定点投影的着色数据(所有都来自于几何阶段),光栅化阶段的目的是计算并设置物体表面的像素颜色。这一操作被叫做光栅化(rasterization)或扫描转换(scan  conversion)。这是因为将屏幕空间中的二维顶点—包括各自的z值(深度值)与每个顶点的各种着色信息的联合转换成屏幕上的像素。

    像几何阶段,这一阶段也分为如下若干功能阶段:三角形设定、三角形遍历、像素着色、融合(2.8)

 

2.8. 这是光栅化阶段所才分成的功能阶段。

 

2.4.1 三角形设定

 

在这阶段计算三角形顶点的差异与其他数据。这些数据用于扫描转换与各种由几何阶段产生的着色数据的插值。这一执行都是在固定操作硬件上执行的。

 

2.4.2 三角形遍历

 

在这检查每个像素中心被三角形所覆盖的像素与生成重叠三角形像素片段。查找在三角形内的样本与像素的操作被称为三角形遍历(triangle traversal)或扫描转换(scan conversion)。每个三角形片段的内容是由三个三角形顶点插值生成的(见第五章)。这些内容包括片段的深度与几何阶段的着色数据。AkeleyJermoluk[7]Rogers[1077]提出了许多三角形遍历的信息。

 

2.4.3 像素着色

 

任意的每个像素着色计算都在这里执行,都以插值着色数据输入。最后结果将一个或多个颜色数据交给下一阶段。不像三角形设定与遍历阶段那样通常由专用的固定线路执行的,像素着色阶段由可编程GPU来执行。在这会用到许多各种的技术,最重要的是纹理(texturing)。纹理会在第六章引入许多具体的细节。简单来说,物体的纹理就像在物体上“粘”一张图片。如图2.9所示。图片可以是一张、两张、由许多普通的二维图片组成的三维图片。

 

2.9. 在左上方展示的是一只没有纹理的龙模型。将纹理图像碎片“粘”到龙上,结果如左下放所展示的。

 

2.4.4 融合

 

每个像素的信息都存放在颜色缓冲区中,他是个颜色的矩形数组(红、绿、蓝组成的每种颜色)。融合阶段任意的将着色阶段产生的颜色片段与当前缓冲区中存储的颜色进行混合。不像着色阶段,他一般不是完全由可编程GPU子单元执行。但是,这是需要高配置、支持各种效果的。

    这一阶段也支持能见度。这就意味着当全部场景都渲染完成,颜色缓冲区应该包含场景中物体对于摄影机的能见度。对于许多图形硬件,这是由Z缓冲区(也叫做深度缓冲区(depth buffer))算法[162]所做的。Z缓冲区的大小和形状是与颜色缓冲区一样的,并且每个像素存放与摄影机最近的物体z值。也就是说当渲染物体的某一像素时,物体该像素的z指与Z缓冲区中相同像素的z值进行比较。如果新的z值比Z缓冲区中的小,那么这一物体该像素就比之前存储在缓冲的物体像素更接近与摄影机。因此缓冲区的z值与像素的颜色会由所画物体的z值与颜色所更新。如果计算的z值比Z缓冲区中的z值大,那么颜色与Z缓冲区将不会受影响。Z缓冲区算法非常简单,收敛与On)(n是渲染物体的个数),并且绘制物体的每一像素的z值经过计算。值得注意的是这一算法允许任意次序的物体绘制,这也是他普及的另一原因。但是,部分透明的物体不能以任意的次序渲染出来。他们必须在不透明物体全都渲染之后以后来者居上(back-to-front)的顺序渲染(5.7节)。这是Z缓冲区的一个巨大弱点之一。

    我们已经说了,颜色缓冲区用来存放颜色而Z缓冲区存放每个像素的z值。但是,也有其他的通道和用来过滤与获取信息片段的缓冲区。alpha通道是由颜色缓冲区与每个像素相关的不透明度组成的(5.7节)。在片段进入时,alpha测试操作能在深度测试之前执行。片段的alpha值会由指定的测试(相等、大于等)与参考值比较。如果片段通过测试失败,那么他会在进一步执行中移除。这一测试的一般是用来确保完全透明片段不会影响到Z缓冲区(见6.6节)。

    模板缓冲区(stencil buffer)是离屏缓冲区,用来记录渲染物体的位置。一般由8位的像素组成。物体能用各种函数渲染到模板缓冲区,这一缓冲区也能用来控制是否渲染颜色缓冲区与Z缓冲区。例如,假设在模板上画了一个填充的圆。这就能使随后物体在圆内的部分渲染到颜色缓冲区中。在管线最后的所有的这些功能叫做光栅操作(ROP)或融合操作(blend operations)

    框架缓冲区(stencil buffer)一般由系统中所有的缓冲区组成,但是有时也仅表示颜色缓冲区与Z缓冲区的集合。在1990年,HaeberliAkeley[474]提出了另一种对框架缓冲区的补充,叫做累计缓冲区(accumulation buffer)。在这缓冲区中,图像可以由一个操作集合进行累积。例如,通过将一系列物体的移动图像进行累积与平均生成模糊动画。其他包括视野深度、反锯齿、柔化阴影等效果也能由此实现。

    当物体通过了光栅化阶段,这些能被摄影机所看见的都会在屏幕上显示出来。屏幕显示颜色缓冲区中的内容。为了避免观察者看物体像是经过了光栅化并发送给屏幕的,双重缓冲区(double buffer)就被使用了。一旦屏幕已经渲染的后台缓冲区(back buffer),后台缓冲区的内容将会去之前屏幕显示的前台缓冲区(front buffer)进行交换。交换操作发生在垂直回扫(vertical retrace)期间。

    对于更多关于不同缓冲区与缓冲区方法的信息,请见5.6.218.1节。

 

2.5 通过管线

 

渲染物体是右点、线和三角形构成的模型或对象。想象一个程序是交互式的计算机辅助设计(CAD)程序,用户检查一款手机的设计。如此一来,模型就要通过图像渲染管线的全部阶段,包括三个主要阶段:程序、几何、光栅化。在屏幕上描绘了在窗口中的场景。在这简单的例子中,手机模型包括线(展示边缘部分)与三角形(展示面)。一些三角形由二维图像纹理渲染,如键盘与屏幕。在这例子中,在几何阶段计算着色,除了在光栅化阶段发生的纹理程序。

程序

CAD程序允许用户选择与移动手机的部件。例如,用户可能选择手机的顶部并移动鼠标翻开手机。程序阶段将鼠标移动转译成相应的旋转矩阵,那么在渲染时就能看见矩阵合适的应用带盖子上。另一个例子:一个动画展示了摄影机以预定的路线、不同的视角观察手机。如摄影机的位置、观察方向等参数必须由程序依照时间实时更新。对于渲染的每一帧,程序阶段都会将摄影机的位置、光照与模型物体交给管线的下一阶段—几何阶段。

几何

在程序阶段计算观察变换,与记录每个物体的特定方向与位置的模型矩阵。对于通过几何矩阵的每个物体,两个矩阵通常相乘得到单一的矩阵。在几何阶段,物体的顶点与法向量转换成连接矩阵,将物体放到视图空间中。然后用材质与光源属性计算顶点着色。接着执行投影操作,将物体转换到眼睛所看的单位立方体中。所有在立方体外的物体都被抛弃。为了得到都在单位立方体内的物体,用单位立方体去裁剪所有的物体。然后将顶点映射到屏幕的窗口中。在所有的多边形都处理过之后,将结果数据交给光栅化阶段—管线的最后主要阶段。

光栅化

在这阶段,所有的物体都被光栅化,也就是在窗口上绘制像素。在每个物体中的有效线段与三角形通过光栅化到屏幕空间,准备绘制。这些拥有问纹理的三角形用纹理去渲染他们。通过Z缓冲区算法解决能见度、alpha测试与模板测试。每个物体都通过这一操作最终在屏幕上展示图像。

 

总结

 

这一管线是API数十年的结果,并且图形硬件会向着实时渲染程序发展。值得注意的是不只是渲染管线;离线渲染管线也有所不同的发展。对于影片制作的渲染一般是用多边形管线[196,1236]来做的。学术研究与预测渲染程序,如建筑可视软件常用光学追踪管线实现(见9.8.2节)。

    多年来,程序开发人员都采用图形API所定义的固定功能管线进行编写。之所以叫做固定动能管线是因为图形硬件的执行是由各种不可编程的元素灵活组成的。管线的各种部分能设置不同的状态。例如Z缓冲区测试是否通过,但是这只是不能写程序去控制各种应用功能的次序。最后的例子,固定功能器是任天堂Wii可编程GPUs实现了通过管线各种子阶段的高精度成为可能。随后学习固定功能管线的一些基本定义,许多开发都以可编程GPU为目标。为了充分利用GPU的优点,该第三版书默认使用可编程的。

 

进一步阅读与资源

 

Blinn的一书A Trip Down the Graphics Pipeline[105]是本关于软件渲染的,但是是一本很好的关于一些微妙执行渲染管线的书。对于固定功能管线,敬重的OpenGL Programming Guide[969]提供了对用户透彻描写固定管线与相关算法的书。本书网址,http://www.realtimerendering.com,提供了各种渲染引擎的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值