http://www.cnblogs.com/wuhanhoutao/archive/2007/11/10/955293.html
早期的三维场景绘制,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由CPU单独完成,而渲染一个复杂的三维场景,需要在短时间内处理几百万个三角形顶点和光栅化上百万个像素,擅长于执行串行工作的CPU实际上难以胜任这项任务,速度上达不到要求。所以,若要求在PC上实时生成三维图像,则将牺牲质量,导致画面很粗糙。现阶段,GPU的发展极大地提高了计算机图形处理的速度和图形质量,并促使图形处理功能不断从CPU向GPU转移,如顶点坐标转换计算等,而且GPU本身亦不断增强了图形处理的各种高级功能,如遮挡剔除、纹理映射、透明与半透明处理、景深效果等。
本章将从GPU特点与其支持下的渲染流程角度出发,提出采用GPU具备的绘制到纹理功能,获取上帧信息,进行可见性判断,从而剔除不必要渲染的场景模型,实现场景加速绘制的方法;针对过大或不符尺寸的纹理导致GPU因显存不足而频繁交换的问题,介绍Mipmap技术与Clipmap技术;最后,引入面向GPU顶点缓存的通用渲染顺序与多级缓存的格网布局方法,并配合上一章介绍的视点相关的实时有选择性细化方法,期望进一步提升大数据量场景绘制的速度。
5.1 引言
5.1.1 GPU发展历史
我们正处在信息技术高速发展的年代,而计算机图形处理技术的发展速度则是计算机应用行业中最快的。无论是从用于图形设计的硬件、可视化应用的画面品质、各种三维游戏和仿真场景的画面处理、使用图形技术的交互式应用程序还是从计算机动画等方面来看都是如此。十多年前用于计算机图形设计的硬件还是那种价值昂贵的图形工作站,而如今基本上都已经发展为单芯片的图形处理器。
1995年,PC机领域第一款带有GPU的显卡3dfx Voodoo出来,使得游戏的速度、画质取得了一个飞跃。3dfx Voodoo有两个主要的特征:深度缓冲区(z-buffer)和纹理映射(texture mapping)。z-buffer执行“隐藏面消除”这一工作,可以避免渲染不可视的无效像素。利用纹理映射功能则能十分逼真地表达物体表面细节。1999年,第二代GPU (NVIDIA GeForce256,GeForce 2和ATI Radeon 7500)包括了图形的几何变换与光照计算功能(Transformation and Lighting, T&L)。而在此之前T&L都是由CPU完成的,这对CPU来说是很复杂的计算。第二代GPU解决了系统的这个瓶颈,减轻了CPU的负荷,速度明显提高了。但是由于是固定的渲染流水线,缺乏灵活性,束缚了开发人员的创造性。2001年,NIVIDA公司的GeForce 3首先引入了可编程的顶点着色器(Vertex Shader)单元。紧接着在2002年,可编程的像素着色器(Pixel Shader)单元也加入进来。在绘制时,GPU首先接收CPU以三角形顶点形式发送的几何数据。然后由可编程的顶点着色器单元进行处理,完成几何变换与顶点属性计算等功能。接着,这些三维空间的三角形由光栅生成器转换为二维屏幕上的像素。每个像素的最终颜色值都通过运行在像素着色器上的小程序运算得到。目前三维游戏和仿真场景借助于GPU,在数据量不是很大并且光照阴影处理不是太复杂的情况下,已经能够实时生成细腻、逼真的画面。
5.1.2 GPU特点
GPU的功能更新很迅速,运算速度也越来越快。2004年推出的GPU Nvidia GeForce 6800 Ultra可达到峰值40 Gigaflops( 1 Gigaflops=1秒钟进行10亿次的浮点运算),2005年刚发布的 Nvidia GeForce 7800 GTX更是将峰值提高至169 Gigaflops。而Intel 3GHz Pentium 4采用SSE指令集只能达到6 Gigaflops(见图5—1)。GPU的运算速度如此之快,主要得益于GPU是面向图形实时渲染定制的,具有两点主要特征:超长流水线与并行计算。![](https://i-blog.csdnimg.cn/blog_migrate/a92916327f23dbea3749ef482f89a4e3.jpeg)
采用流水线方法,比简单的串行方式能提前完成图形渲染任务。为了提高流水线的速度,可以将任务划分成更小的单元,这样流水线的级数就会增加。CPU的设计中就使用了流水线原理,奔腾IV就有20级的流水线。但是流水线级数并不是越多越好,级数太多,一条指令从开始进入流水线到最后被执行完毕之间的延迟间隔会相当大。换句话说,当流水线级数过多时,控制台发出一条指令后,要经过较长时间才会真正生效,这不适合快速反应要求很高的场合。CPU的设计目标要求有很小的延迟,所以这是CPU并不采用过多流水线级数的原因之一。另外流水线只有在满载时,才能发挥出最佳效率来。由于CPU执行的代码中有很多分支语句,因此长流水线需要尽量保持其在满负荷状态。而一旦预测分支失败,就会清除流水线中滞留的大量无用指令,同时将新指令流重新注入流水线。如果流水线阶段过多的话,充满整个流水线就需要很长的时间,这样使流水线保持满载的机会不多,速度反而下降了。所以权衡利弊,CPU不会使用深度流水线。
但是GPU却采用了几百级的流水线,这是因为GPU应用可以忍受大的延迟。时钟周期与流水线级数的乘积远小于显示每帧画面的时间,所以对GPU来说延迟不成问题,而且GPU中执行的象元片段程序中,分支语句用的很少(在早期的GPU中,甚至不提供动态的分支语句)。因此,GPU的流水线深度变大后,利大于弊,大大提升了整体性能。
GPU的执行速度很快,但是当运行从内存中获取纹理数据这样的指令时(由于内存访问是瓶颈,此操作比较缓慢),整个流水线便出现长时间停顿。在CPU内部,使用多级Cache来提高访问内存的速度。GPU中也使用Cache,倘若Cache命中率不高,则仅使用Cache就不能很好的解决这个问题。所以,为了保持流水线忙碌,GPU工作时又使用了多线程机制(Multi-threading)。当像素着色器针对某个像素的线程A遇到存取纹理的指令时,GPU会马上切换到另外一个线程B,对另一个像素进行处理。等到纹理从内存中取回时,可再切换到线程A。使用这种方法有一个前提,线程A与线程B没有数据依赖性,也就是说两线程之间无需通讯。如果线程B需要线程A提供某些数据,那么即使切换到线程B,线程B仍是无法运行,流水线还是处于空闲状态。需要说明的是,图形渲染本质上是一个并行任务。无论是CPU送给GPU的顶点数据,还是GPU光栅生成器产生的像素数据都是互不相关的,可以并行地独立处理。而且顶点数据(XYZW),像素数据(RGBA)一般都用四元数表示,适合于并行计算。此外,纹理片要么只能读取,要么只能写入,不允许可读可写,从而解决了存贮器访问的读写冲突。GPU这种对内存使用的约束也进一步保证了并行处理的顺利完成。
为了进一步提高并行度,可以增加流水线的条数。多条流水线可以在单一控制部件的集中控制下运行,也可以独立运行。在单指令多数据流(SIMD)的结构中,单一控制部件向每条流水线分派指令,同样的指令被所有处理部件同时执行。另外一种控制结构是多指令多数据流(MIMD),每条流水线都能够独立于其他流水线执行不同的程序。GeForce 6800 Ultra的顶点着色器流水线使用MIMD方式控制,像素着色器流水线使用SIMD结构。MIMD能比较有效率地执行分支程序,而SIMD适合于大数据量的像元处理。
总的看来,相对于并行机而言,图形卡提供的并行性虽然很弱,但它在十分廉价的基础上为很多应用提供了一个很好的并行方案,尤其是对于图形本身的应用来说。新的图形硬件在图形渲染上的优势还包括:
1) 在顶点级和像素级提供了灵活的可编程特性;
2) 减少了GPU与CPU的数据通信。尤其是当整个应用针对图形生成的时候,不再需要在CPU与GPU之间进行多次数据交换,从而可以让CPU解放出来完成其它的任务;
3) GPU相对于CPU来说,更适应传输大块的数据,虽然CPU上有Cache以加速整个计算过程,但CPU上的Cache相对于图形卡显存来说太小,一般只有64KB,而现在的显存大多都在64M以上,由此可见一斑;
4) 支持绘制到纹理的功能(Render-to-Texture/pbuffer),从而避免将计算结果拷贝到纹理这一比较费时的过程;
5) 支持依赖纹理功能,以方便数据的索引访问,可以将纹理作为内存来使用。
5.1.3 GPU支持下的图形渲染流程
首先根据图5.2粗略说明一下当前普遍流行的AGP(Accelerated Graphics Port,图形加速端口)显卡的渲染流程。
每次渲染过程都包括顶点处理(Vertex Processing)和像素处理(Pixel Processing)两个主要功能模块的执行。首先,显卡从AGP总线接收顶点数据。这些数据包括位置、法线、贴图坐标(如果是面包可能更需要贴图,也就是说贴图坐标不是必需的)等等,这些都是未经过任何变换,也就是在物体本地空间(Object Space)下的原始坐标。每个顶点依次被送入顶点处理单元,在这里进行坐标变换、光照计算(如果是每顶点光照)等工作,变换的结果是把每个三角形变换置屏幕空间下直接可用。这里用到的变换矩阵、灯光等信息都是处理每一批顶点时一次性传给显卡的,作为显卡的资源。顶点处理圈定了三角形的范围,接下来就要逐像素地填充这个三角形了。填充哪些像素是靠对顶点屏幕坐标的线性插值来决定的。像素的其他一些必要参数,如颜色,贴图坐标等也是通过对上一步计算出来的顶点的这些属性进行插值得到的。另外每个像素还要通过深度检测和模板检测决定最终是否绘制。需要绘制的像素被送进像素处理模块,进行贴图像素取值,贴图混合等工作,必要的话每像素光照也在这里完成。这里贴图等信息也是作为显卡的资源。像素最终的处理结果被放进帧缓冲。![](https://i-blog.csdnimg.cn/blog_migrate/25ea43e58ca46d6e9b76cea41d58ff43.jpeg)
5.2上帧信息提取
可编程图形显卡的出现增加了满足人们对三维仿真场景更加逼真、更加流畅显示等方面需求的机会。这些商用显卡已经被广泛的应用,因此相关关键技术的研究变得越来越迫切。如何从上一帧图像提取颜色、深度等信息来指导输入到图形流水线的场景中模型结点的选择、更新,如何在硬件支持下优化渲染流程等是有意义的研究内容。
针对大数据量三维仿真场景,从三维模型成像机理等方面对大数据量仿真场景中目标的载入、选取和消隐进行了深入的分析之后,利用视觉成像理论、次缓冲区(pBuffer)技术和简化方法等,对大数据量仿真场景开展加速选择和更新等方面的研究工作。为提取上帧信息,采用GPU的绘制到纹理功能,进行可见性判断,剔除不必要绘制的场景模型,实现场景加速绘制的优化处理,采取的具体方法如下:
若场景范围大或三维模型的尺度大,其在绘制选择、绘制和渲染等流程后,显示在屏幕上时往往有延迟现象。现考虑,将原始模型和对应的最简化版或外框架作为两个结点进行显示,但分配原始模型在主缓冲区上,分配其对应的框架模型在新建的次缓冲区(pBuffer)上。由于两个缓冲区大小是同比例的,并共享同一个相机,那么两种模型从投影转换到最后的输出显示,即是反应同步的,在结果上也是近似的。由于显示的大小是同比例的,但在流程中栅格化等操作会影响像素的显示,所以说结果是近似的。在每一帧(或者每5帧,要求人眼分辨不出来)结束后,读取pBuffer上的像素(一般RGB格式)到数组中,循环判断每个数组元素的颜色,记录下各种颜色的数量。由于在创建框架模型时分配了每个模型对象相异的颜色,从而此时通过颜色能判断出pBuffer和主缓冲区上显示出来的到底是哪些模型。用得到的结果指导下一个周期的原始模型中选择哪些子集。这样做的好处是,不用将整个大数据量的原始模型进行一遍局部到世界坐标系,再到视点坐标系,最后透视变换、裁减等操作。只是将剔除视见体外和被遮挡的物体后剩余的模型交给渲染流程,因而能节约计算、存储等资源,加快显示速度。
初步实验结果见图5.3与图5.4,其中由7个立方体模型组成的场景文件大小为130M, 三角型个数70多万个。在没有遮挡关系的情况下,普通与改进方法下帧速均为5.4帧每秒;在有遮挡关系情况下,普通方法下帧速保持不变,还为5.4帧每秒,而改进方法下帧速增加到12.5帧每秒左右。![](https://i-blog.csdnimg.cn/blog_migrate/9f6d206c6c3c65ac39f401c15aabded6.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/32c8dcac7d4437e3ef0e6bcbe2b0deac.jpeg)
5.3 针对GPU的纹理优化处理
纹理映射(Texture Mapping)是绘制复杂场景真实感图形最为常用的技术,它可以通过纹理来表达表面丰富的几何细节和光照细节,甚至可以通过映射后纹理的变形来表达物体的几何形状:在未增加物体多边形数情况下,增强了物体的真实感效果。
但过大或是不符尺寸的贴图,将占用太多的纹理带宽,导致GPU因显存不足而频繁交换,采取的措施是:尽量缩小贴图或使用Mipmap技术。Mipmap技术的核心就是纹理的LOD。高分辨率的Mipmap图像用于接近观察者的物体,当物体逐渐远离观察者时,使用低分辨率的图像。Mipmap可以提高场景渲染的质量。
Mipmap映射技术是快速的查找技术,快就快在它在交互前预先生成了纹理图像的一系列的基本采样数据,形成纹理LOD模型,在交互过程中系统能快速应用纹理LOD生成逼真视景。这一优点对实时交互系统中的纹理映射至关重要,但是根据纹理映射的应用技术,对于大纹理数据是不能将整个纹理Mipmap驻留在有限的硬件纹理内存和系统内存中的,同时,由于带宽的限制,也存在着交互前载入整个纹理需要漫长的时间。
以前解决有效物理纹理内存大的纹理映射问题,比如地形纹理,常常采用根据地形模型把原始纹理图像分割成大量的小片纹理,使这些小纹理能适应物理的纹理内存。
现普遍采用Clipmap方法是,采用首先建立原始图像的Mipmap,而不是装载时才创建,这对比较大的纹理来说是重要的;其次,把创建的Mipmap各层存储在硬盘上,只把裁减下来的Mipmap部分即Clipmap调入纹理内存用于实时绘制。5.4 针对GPU的几何数据优化处理
5.4.1足够的三角形数量供给
从理论上分析,一旦CPU使用率达到100%,再考虑优化问题,则能够提升的空间将是非常有限的,因为CPU的频率决定了每帧调用绘制几何元素集合的次数,所以应该尽量减少调用次数,增加批处理中的三角形个数。 太多的调用次数,只会让CPU忙于通讯,而GPU却一直在空闲;另一方面来看,太少的三角形数量也满足不了GPU的处理容量。
5.4.2 模型格网布局
5.4.2.1面向GPU顶点缓存的通用渲染顺序
计算机图形学应用的趋势是大量使用多边形来增强图像的真实性,这种趋势随着近来图形硬件的发展,特别是GPU在低端显示设备上的出现而特别明显。GPU意味着图形适配器能完成扫描转换,也能完成3D几何投影和阴影计算。因此,场景几何处理不再如同过去那样是最大的瓶颈。
为了加快处理几何顶点元素,GPU保留了固定尺寸的先进先出(First Input First Output,FIFO)顶点缓存,通过此种方式进行顶点遍历。而渲染以三角形为基础的通用三维格网,每个顶点参与处理的次数可能大于一次,根据对大多数格网的统计,平均每个顶点参与六个三角形的绘制。我们知道,处理缓存顶点将比处理非缓存顶点快得多。因此,为了最大限度的使用缓存,必须以保留局部相关性的顺序渲染格网三角形。这个三角形依次渲染的顺序被称作格网渲染顺序。一个好的渲染顺序能最小化三角形的缓存错失数,称作平均缓存错失率(Average Cache Missing Ratio,ACMR),因为典型格网的三角形数量接近顶点数量的两倍,倘若在图形渲染时顶点数据需要第一次从外部调入缓存,这算作一次错失,而其它绘制的时候,顶点数据不错失,那么下限数值为0.5;倘若绘制每个三角形的三个顶点时候数据都错失,上限范围达到3.0。所以理论上ACMR取值在0.5与3.0之间。注意,此顺序不必要是连续的,在渲染顺序上相连接的三角形不一定在格网空间上是相连接的。
3D格网通常以任意的三角形序列排列,其每个三角形又以指向顶点列表的三个顶点索引标明。普通渲染器就按照文件中顺序将三角形送入图形流水线,得到一般的性能。更复杂的渲染器使用三角形条带技术,能以FIFO顶点缓存尺寸为2来渲染三角形,这实际上是3D硬件的标准部件。Akeley等(1990)描述了产生三角形条带的算法。然而由于缓存的有限尺寸,能证明在这种缓存尺寸下不能将ACMR降低到1.0以下。Hoppe(1999)提出一种算法来产生面向透明FIFO缓存的渲染顺序,从实验上展现其算法对任意的顶点缓存产生渲染顺序,其ACMR不会明显差于Chow的算法。然而所有算法的一个主要问题,是必须事先知道缓存尺寸,对某个缓存尺寸产生的渲染顺序,当使用到一个更小尺寸的缓存时渲染格网产生的结果也许远离优化目标。
另外一个现有算法的缺陷是不能推广到累进格网。累进格网不同于固定分辨率格网,格网连通性是动态的,所以不可能预先计算三角形条带。格网是不断变化,渲染顺序也必须随之变化。这方面工作有El-Sana(1999)提出保持累进格网的三角形条带方法。另外,Hoppe(1997)采用在每一帧的时候,使用一种贪婪算法来产生三角形条带。此算法遍历活动三角面 ,并在任何没有被渲染的面之处,开始一个新的三角形条带。然后,检查是否有邻接面还没有被渲染,就这样,连接条带。为了降低图形状态的变更,仅仅只有相同材质的邻接区域被考虑。为降低流水线负担,倾向于连续螺旋型三角形条带。但条带达到结束末端时候,对链表 遍历重新开始。面数据结构中有一个标志来记录已经渲染的面,下次渲染时这些标志会被清空。
空间填充曲线实际上是在某种程度上保留局部相关性的多维格网单元遍历。普遍目标是产生一种渲染顺序,当每个三角形渲染时候,希望尽可能多的三角形顶点已经存在于缓存中。如果不是这样,缓存错失开始计数。
下面介绍的递归切割方法是受传统空间填充曲线启发,而最小线性安排(Minimum Linear Arrangement, 简称MLA)方法是通过求解优化问题得到答案(Bogomjakov, A., Gotsman, 2001)。
递归切割方法。在四边形格网(其尺寸为2的幂)上传统的空间填充曲线有良好的局部相关性。对于规则三角网(取代四边形格网)容易使用Hilbert曲线来产生渲染顺序。Hilbert建立过程是:将格网分为四块(每块相同);递归的渲染第一块中所有三角形,然后递归的渲染第二块中的所有三角形,依此类推。当格网仅包含几个三角形时递归终止。注意,第一块中最后一个三角形邻近第二块中第一个三角形,对于第三和第四块是一样的处理。由于格网结构是规则的,将有可能达到目标,并保证曲线连续。Hilbert曲线的建立提示了下面类似的不规则三角网的递归程序:分区格网到两个近似相同的子网。首先渲染第一个格网,接着是第二个。同时保证,第一个子网的结束顶点是邻近的第二个子网的入口顶点。为了更加精确,需要找到一种平衡切分,产生两个尺寸大致相同的顶点集合,如果边界处的切割边数量少就更好。程序首先渲染左边子网,然后是跨越切割边的三角形,接着是右边子网。![](https://i-blog.csdnimg.cn/blog_migrate/5cea2d58941c28164adead8902253443.jpeg)
这意味着所有参与一条超边的顶点应该被映射到邻近区域中。
格网渲染问题也能被看成MLA的一个实例。超图的顶点对应着格网的三角形,超边集合对应着格网顶点集合。一条超图的边联系着入射到相同格网顶点的所有三角形。超边的长度意味着格网顶点上第一个和最后一个三角形的渲染顺序距离。
本文研究大数据量场景的实时渲染,并在上一章介绍了应用累进格网技术来提高渲染性能。应用中,场景的多边形数量实时改变。对于给定的更新记录序列,必须不仅生成最高分辨率的渲染顺序,也有对应的更新记录的顺序。这样,在低分辨率时也能连续较好的运行。
采用顶点缓存个数为16的模拟程序对球与头部三维模型进行迭代切割法与MLA算法处理后与原始渲染顺序的对于实验。在渲染顺序路径图中,相邻三角形用白色线段表示,而红色线段表示绘制三角形时产生了跳跃现象,即没有绘制相邻三角形。迭代切割法中基本是白色线段,说明按照相邻三角形路径绘制。在示意图中,每一种颜色标志对应顶点的不同缓存错失数量。假设顶点 参与三角形 绘制。如果 的角是灰色的,意味着 绘制时候没有错失 。绿色表示第一次错失 ;蓝色表示第二次错失 ;红色代表三次或更多次数错失。对每个顶点来说,都会有一个绿色角,因为第一次总要将顶点加载到缓存中。好的渲染顺序目标就是使得灰色尽量多,而蓝与红色尽量少。从图5.6与图5.7中明显看出,原始模型的红色角多,而处理过的模型,无论采用的是迭代切割算法或MLA算法,绿色与蓝色角多而红色角少,这意味着经过处理的模型缓存错失数量减低。通过表5.1的统计数据得到处理后的模型渲染速度有提高的结论。
![](https://i-blog.csdnimg.cn/blog_migrate/810ddffb24ef9bb50165f414bba1aad9.jpeg)
5.4.2.2面向多级缓存的格网布局
处理大数据量格网的算法利用了CPU和GPU的计算能力,用于交互显示和几何应用。在近十年,处理器与主存储器之间的差距已经在扩大。结果是,系统架构不断的使用缓存和存储层级来避免内存等待时间。存储层级的不同层次的访问时间也有很大不同。在某些情况下,一个程序的运行时间可看成是缓存访问模式的函数,并与其操作次数有很大相关性。
为了设计有效的缓存算法来处理大数据量格网,两个通用的减低缓存错失的技术是:1)计算重排序:提高程序的局部性,这能通过编译器优化或人工调整达到;2)数据布局优化:依据访问模式计算缓存连贯的数据布局(Yoon, S.-E., Salomom, B., Gayle, R., Mannocha, D , 2004)。
缓存有效算法能被分类为缓存介意的与缓存非介意的。缓存介意算法使用缓存参数,如分块大小。与此相反,缓存非介意算法不用事先知道任何缓存参数。缓存有效算法方面有大量研究工作,服务于一些应用,比如数值程序、排序、几何计算、矩阵乘法、FFT和图形算法。面向这些应用,大多数算法重组织数据布局,如计算一种新的排列顺序。
大多数现代计算机使用存储层级,其每一层级作为下一层的缓存。存储层级有两个主要特征。首先,较高层级尺寸也会大,接收处理器指令较慢,拥有较慢的访问时间。第二,不同存储级别之间,数据存在于大的块中。格网初始存在于最高级别中,典型的如硬盘。应用访问时格网某一部分将被转移到较低级别的大分块中,如主存。当有缓存错失发生的时候,两个相邻级别之间转移就会执行。缓存错失次数依赖于原始格网在存储空间中的布局与应用访问模式。
格网布局是顶点与三角形的线性顺序。构建一个图,其中顶点代表格网中的数据单元。如果顶点代表的数据单元有可能在运行时被连续访问,那么两个顶点之间存在一条边。对于单分辨率格网布局,映射格网顶点与边到图的顶点与边上。一个无向图 的顶点布局是顶点到位置的一一映射, ,目标是找到一种映射 ,使得格网访问过程中最小化缓存错失数量。
格网布局有两种布局类型:顶点布局与三角形布局。而三角形布局可被看成是顶点布局的对偶图,因为通过依赖三角形最大或最小顶点索引来排序三角形,将确保三角形布局与顶点布局兼容。
为计算层次的布局,可建立一个图来获取对层次的缓存连贯访问模式。在图中增加额外的边来获得层次中的空间局部关系与父子联系(Yoon, S.-E., Manocha, 2005)。
父子结点之间的联系。一旦层次中某一结点被访问,有很大的可能性紧接着访问其父结点与子结点。比如,VH中结点的顶点劈分激活其子结点,两个兄弟结点的边折叠操作激活它们的父结点。
同一层次顶点之间空间局部相关性。当一个结点被访问时,其邻近区域的其它结点有很大可能性被马上访问的。比如,两个物体的碰撞和联系发生在小的格网局部区域中。因此,如果BVH中一个结点被激活,其它邻近区域中的结点可能马上被访问。
5.5 本章小结
GPU专门为图形渲染设计的,具有超长流水线与并行计算等主要特征,运算速度越来越快,同时,在顶点级和像素级还提供了灵活的可编程特性以及支持绘制到纹理等功能。因此,本章首先介绍了GPU特点与其支持下的图形渲染流程之后,提出采用GPU绘制到纹理功能,获取上帧三维模型成像信息,进行可见性判断,再把剔除视见体之外与被遮挡物体后剩余的三维模型交给图形流水线的方法,从而能节约计算时间,加快显示速度。
针对过大或不符尺寸的纹理导致GPU因显存不足而频繁交换的问题,介绍Mipmap技术与Clipmap技术,既能保证比较快速的纹理查找速度,又能有效解决硬件的存储限制和载入带宽的瓶颈。
指出在几何数据处理过程中为避免CPU使用率达到上限,首先应该保证GPU足够的三角形吞吐量。其次,缓存在大多数GPU上是可用的,当使用FIFO顶点缓存在最大程度上重复使用顶点时,将有利于提高模型格网的渲染速度。因此,介绍了迭代切割与MLA两种方法以产生模型格网的渲染顺序,生成的几何数据布局结果尽可能保留了格网局部性并保证了顶点重用,还配合了上一章介绍的视点相关的实时有选择性细化方法,能进一步提升大数据量场景绘制的速度。
最后,还介绍了面向多级缓存的大数据量格网布局,期望能提高交互可视和几何处理算法的性能。这种方案中采用了一种简单、实用的非介意缓存参数检测方法来评估缓存错失,从而将计算一个连贯的格网布局转换为求解一个组合最优问题。