APP下载

基于PBO的地形绘制

2011-09-07谭德林

计算机工程与设计 2011年7期
关键词:纹理绘制像素

谭德林, 谭 良,2

(1.四川师范大学计算机科学学院四川省可视化计算和虚拟现实重点实验室,四川成都610101;2.中国科学院计算技术研究所,北京100080)

0 引 言

地形绘制在游戏虚拟场景、地理信息系统、飞行仿真系统、城市规划、驾驶模拟以及虚拟战场等虚拟环境中应用广泛。因此目前国内外关于地形绘制算法的研究相当广泛。基于LOD的思想,Duchaineau于1996年提出了ROAM地形绘制算法;Lindstrom于1997年提出了动态LOD地形绘制算法;De-Boer于2000年提出了GeoMipMapping地形绘制算法。以上3种算法是地形绘制算法的基础算法,以后的很多地形绘制算法都是由以上几种算法发展而来的。如北京大学的王宏武于2000年提出的基于四叉树的多分辨率地形绘制算法;Levenberg于2002年提出的CABBT算法;浙江大学的陆燕青于2003年提出的基于层次二叉树的多分辨率顶点绘制算法;J.Bittner于2004年提出的GPU遮挡剔除算法等等。对地形绘制算法的研究,可以人为的把其分为两个阶段,即以CPU为核心的地形绘制算法和以GPU为核心的地形绘制算法。在早期,由于受限于以CPU为核心的图形处理流水线,该时期的地形绘制算法都是依赖于CPU的地形绘制算法,如ROAM算法、动态 LOD算法和以它们为基础而改进的地形绘制算法等都属于以CPU为核心的地形绘制算法;随着计算机图形适配器的发展,GPU运算能力被提出并得到广泛应用,以CPU为核心的地形绘制算法已经不符合当代图形适配器的图形处理框架,因此基于GPU的地形绘制算法也相应的被提出,如GeoMipMapping算法或者以GeoMipMapping算法为基础进行改进后所得到的地形绘制算法。国内对基于GPU的地形绘制算法研究较多,如基于索引模板的Patch-LOD地形绘制算法[1]、基于受限法向锥的误差计算方法[2]、基于GPU加速的分形地形生成算法[3]、基于地平线遮挡裁剪的层次化可见性计算方法[4]、基于现代GPU的大地形可视化算法[5]、基于顶点纹理的LOD地形渲染算法[6]等。随着以GPU为核心的地形绘制算法的出现,使地形的绘制不再完全依赖于CPU。基于GPU为核心的地形绘制算法是把地形绘制过程中的地形绘制这部分工作交由GPU来完成。这使得以GPU为核心的地形绘制算法不但能充分的利用当代图形适配器的图形处理功能,同时也把CPU从繁琐的地形绘制算法中解放出来,让其不用过多的参与地形的绘制。通过进一步解放CPU,使得CPU可以直接去参与系统中其它工作的处理。以 GPU为核心的地形绘制算法是当前图形适配器下地形绘制算法的主流。

通过对以上各种地形绘制算法的分析可以发现,目前的以GPU为核心的地形绘制算法大多都是以Geomipmapping算法为基础,或者对其进行改进而得到的。而根据Geomipmapping算法的原理可知,在地形绘制的过程中,需要有纹理加载的过程。通过分析可得,传统的以GPU为核心的地形绘制算法的纹理加载方法的工作流程[7]如图1所示。

图1 传统的纹理加载原理

由图1可以看出,传统的纹理加载方法的基本原理为:首先将纹理源的纹理数据加载到系统内存中,然后再将数据从系统内存拷贝到纹理对象,其整个过程都需要由CPU来对其进行控制。由此可见,传统的地形绘制算法中的纹理加载方法显然不符合当前以GPU为核心的地形绘制算法的“进一步把CPU中地形绘制的过程中解放出来以使其能更多的参与到其它工作的处理中去”的思想。因此传统的纹理加载方法成为了当前图形适配器下各种以GPU为核心的地形绘制算法的瑕疵。为了解决这个问题,在地形绘制算法中引入了PBO[8]。PBO(pixel buffer object)即像素缓存对象,该对象属于GPU的缓存的一部分。因为PBO采用了DMA技术,它在纹理数据从PBO复制到纹理对象的过程中无需CPU而是由GPU来控制。因此在纹理加载时应用 PBO,可以进一步的解放CPU;同时由于PBO的DMA技术采用异步方式,因此可以通过使用双PBO机制来加载纹理。双PBO的引入,使得纹理数据的加载可以用异步并行的方式完成,这进一步加快了纹理数据的加载速度。

1 基于PBO的纹理加载原理

由图1可知,传统的纹理加载方法需要CPU来全程控制,这显然与当前以GPU为核心的地形绘制算法的解放CPU的思想不相符。因此,这里在纹理加载的过程中引入了PBO。基于PBO的纹理加载方法的工作原理流程图如图2所示。

从图2可以看出,引入PBO后,纹理源的像素数据直接被传到PBO中,这个过程仍需由CPU来进行控制;而当纹理数据从PBO复制到纹理对象的过程中,则是采用PBO的DMA技术来完成的,这个过程则由GPU来对其进行控制。由于在这个过程中不需要CPU对其进行控制,因此这时CPU就可以直接去完成其它的任务而不需要等待像素数据传递的结束。

图2 基于PBO的纹理加载原理

由于DMA技术是采用异步方式来完成的,也就是说,在完成纹理源到PBO的数据传输后,可以不需要立刻把PBO中的数据复制到纹理对象。基于这个原理采用了双PBO机制,其工作原理为当某一个PBO正在和纹理对象进行关联操作时,另外一个PBO则和像素源进行新的数据传输。通过采用双PBO机制,使得像素数据传输到PBO的操作和从PBO中复制数据到纹理对象并行工作,双PBO机制的工作原理如图3所示。

图3 双PBO工作原理

由图3可知,当地形绘制到第n帧时,纹理源在CPU的控制下把像素数据写入PBO1的同时,PBO2将其中的像素数据复制到纹理对象。在 n+1帧时则 PBO1和 PBO2的工作过程刚好相反。通过使用双PBO,可以使纹理数据的加载并行处理,这进一步提高了纹理加载的速度。

2 基于PBO的地形绘制的应用及其实现

2.1 基于PBO的地形绘制算法的基本原理

基于PBO的地形绘制算法是在Geomipmapping地形绘制算法的基础上引入PBO而得到的。Geomipmapping地形绘制算法也叫几何误差算法,它是最早的以GPU为核心的地形绘制算法。以后的很多 GPU友好的地形绘制算法都是在它的基础上,并对其进行改善优化后形成的。Geomipmapping地形绘制算法的基本思想是对整个地形进行分块,每一个块的大小为2n+1。根据每块离视点的距离,可以把它标识为可见和不可见。如该地形分块不可见,则直接被裁剪体裁剪掉;如地形块可见,则根据其离视点的距离,又可分为很多细节层次等级,每个细节层次等级对应不同的纹理图像。等级越低,离视点越近,其纹理图像的分辨率也越高;反之等级越高,离视点越远,其纹理图像的分辨率也越低。在分块的层次等级中,0级为分块的层次等级中最低的,其分辨率却是最大的,随着等级的增大,分别率则变小。

基于PBO的地形绘制算法也就是在加载纹理数据时,借助PBO,让纹理源数据直接进入PBO,然后再通过PBO把纹理数据复制到纹理对象。为此,需要先生成PBO对象,接着把PBO和纹理对象进行绑定。这样就可以让纹理源数据直接传递到PBO中,然后再将PBO中的数据复制到纹理对象。为了完成以上功能,需要借助opengl扩展库中的扩展函数来完成。根据不同的参数,可以对PBO进行读和写。如当参数为GL_STREAM_DRAW_ARB时,表示将像素从纹理源加载到PBO中,而参数为GL_STREAM_READ_ARB时,表明从PBO中把像素数据进行异步读出。

同时为了使双PBO能协调工作,需要对这两个PBO进行有效控制,这里将通过使用两个变量来分别标识这两个PBO。在某一帧时,第一个PBO接受像素数据的读入,另一个PBO则把其中的像素数据拷贝到纹理对象;而在下一帧,这两个PBO的功能则刚好进行交换。

2.2 基于PBO的地形绘制算法的体系架构

图4为基于PBO的地形绘制算法的体系结构。基于PBO的地形绘制算法的体系结构中,存在着两条流水线,分别为集合流水线和像素流水线,这两条流水线将于光栅化器处汇合在一起。在该体系结构中,高程图生成器用来产生虚拟环境中地形的高度图,通过高度图,就可以唯一确定世界坐标系中某一点的高度;几何处理器是用来对顶点进行几何变换如平移、旋转、缩放等;像素流水线则对像素进行相应的操作;显示列表[9]是用来把图元信息或者其它的信息作为对象保存到服务器中,这就避免了代价较高的传输和重新生成的问题;光栅化器用来负责生成片段或者说那些可能位于几何对象中的像素;帧缓存[10]位于OpenGL流水线上最后显示阶段像素所在处,帧缓存可以视为二维数组,或opengl使用的存储区域,它包括了颜色缓存、深度缓存、模板缓存和累积缓存。如图所示,通过PBO映射,还可以将opengl控制的缓存对象与客户端地址空间进行内存映射。这样客户端可通过函数glMapBufferARB()和glUnmapbufferARB()来修改缓存对象的数据。

2.3 基于PBO的地形绘制算法的实现

在实现基于PBO的地形绘制算法的过程中,可以分为指定PBO扩展的函数指针、创建PBO对象、传输像素数据等步骤,如下为其部分代码实现:

(1)生成双PBO:

图4 基于PBO的地形绘制体系结构

(2)把数据从PBO复制到纹理对象:

(3)纹理映射:

(4)解除绑定:

如上代码的主要实现了生成两个PBO,把PBO绑定到纹理对象以及让客户端地址空间的内存与PBO进行映射已经传输完数据后把PBO和纹理对象解除绑定。

3 基于PBO的地形绘制算法的验证

基于PBO的地形绘制算法实现的硬件环境为:CPU Pentium®Dual-core CPU,内存为 2GB,显卡为 nvidia geforce g210M。软件环境为:Windows7Proffessional32位操作系统下,使用VC++6.0和OpenGL 2.0完成的。在如上开发环境下,渲染了一个高度图大小1025*1025,窗口大小为1024*768的地形。如图5所示为渲染结果图。

图5 基于PBO的地形

表1所示为渲染不同大小的地形、是否使用PBO以及不同顶点数目时的CPU利用率。

由表1可以看出,使用PBO时CPU利用率比不使用PBO时的CPU利用率要低很多。通过使用PBO,使得在纹理载入时,由PBO复制纹理数据到纹理对象的过程中不需要CPU的控制,以便进一步解放出CPU,使其可以直接去进行其它的工作。

表1 CPU使用率比较

4 结束语

针对当前以 GPU为核心的地形绘制算法以及当前解放CPU和充分的利用GPU的思想,这里以Geomipmapping算法的基础引入了PBO,提出了基于PBO的地形绘制算法。通过使用PBO,减少了CPU对地形绘制的控制,进一步解放了CPU和使用GPU。同时,由于PBO的DMA技术采用异步方式,所以可以通过双PBO对象来使得从纹理源传递像素到PBO和从PBO复制纹理数据到纹理对象并行进行,这也进一步提高了像素传递的速度。由实验结果可知,基于PBO的地形绘制算法完全符合当前解放CPU并充分利用GPU的地形绘制算法的思想。

[1]皮学贤,杨旭东,李思昆,等.基于索引模板的Patch-LOD地形绘制算法[J].计算机研究与发展,2005,4(增刊):183-187.

[2]李胜.超大规模地形场景的高性能漫游[J].软件学报,2006,17(3):535-545.

[3]马淑芳.基于GPU加速的分形地形生成方法[D].大连:大连理工大学,2008.

[4]何旭锋.大规模复杂场景的加速绘制方法研究与实现[D].成都:电子科技大学,2009.

[5]潘宏伟,李辉,廖昌阁,等.一种基于现代GPU的大地形可视化算法[J].系统仿真学报,2007,19(7):3241-3244.

[6]张桀宁,李帅.一种基于顶点纹理的LOD地形渲染算法[J].系统仿真学报,2008,20(4):1758-1764.

[7]纹理加载方法[EB/OL].http://blog.sina.com.cn/s/blog_4062094 e0100alvt.html,2008.

[8]PBO介绍[EB/OL].http://www.songho.ca/opengl/gl_pbo.html,2007.

[9]段菲.openGL编程基础[M].3版.北京:清华大学出版社,2008:66-69.

[10]帧缓存[EB/OL].http://blog.sina.com.cn/s/blog_4062094e0100 alvv.html,2008.

猜你喜欢

纹理绘制像素
像素前线之“幻影”2000
基于Excel VBA和AutoCAD的滚动轴承参数化比例图绘制方法
基于BM3D的复杂纹理区域图像去噪
“像素”仙人掌
超萌小鹿课程表
使用纹理叠加添加艺术画特效
放学后
ÉVOLUTIONDIGAE Style de vie tactile
TEXTURE ON TEXTURE质地上的纹理
消除凹凸纹理有妙招!