基于基元重启OpenGL和CUDA图形渲染算法探索.docVIP

基于基元重启OpenGL和CUDA图形渲染算法探索.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于基元重启OpenGL和CUDA图形渲染算法探索

基于基元重启OpenGL和CUDA图形渲染算法探索   摘要:针对OpenGL渲染图形要多次访问缓存区的问题,提出一种OpenGL和CUDA混合编程的图形渲染算法来加速PerlinKernel生成虚拟地形图。首先,通过OpenGL将缓存映射到CUDA内存空间,利用CUDA完成加速计算任务;然后,为几何图形设置开始和结束的位置标志,使用基元重启对图形进行组合;最后,对缓冲区对象进行渲染。实验结果表明,改进后的基于基元重启的混合算法在GTX650GPU上的平均帧速率为960fps,帧速率提高6%,算法改进后渲染方法的执行效率提高了63倍。实验证实基元重启可以提高3D处理性能。   关键词:图形渲染;OpenGL;CUDA;基元重启;Perlin   中图分类号:TP393文献标识码:A   1引言   图形渲染在核试验、DNA分子分布、天气预报等大规模科学计算任务中扮演着重要的角色[1,2]。在OpenGL中图形渲染是由CPU进行单独完成的,CPU从RAM中获得数据并且处理数据,然后写入RAM中[3]。这样做性能并不高,原因如下:①CPU的负载重而导致响应速度慢,影响渲染速度和质量;②图形渲染中使用了multiDraw()方法,绘图开销过大。multiDraw()用一条命令代替了多条glDraw*()方法,但是使用这个方法,导致顶点数组扩大了1/2,大量的冗余数据传输到CPU中,造成极大的开销[4-7]。   本文提出了一种CUDA和OpenGL混合图形渲染的方法。CUDA(ComputeUnifiedDeviceArchitecture),是NVIDIA显卡厂商推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题[8-10]。在本文中,为了进一步提高数据传输效率,图形渲染中引入了基元重启,使用基元重启可以对几何图形进行组合,组合之后,需要处理的集合图形数据更少,系统运行速度更快。   2.1传统的OpenGL图形渲染   OpenGL中的顶点,颜色,法线和其它顶点属性数据都是由GLTools库管理的。每次调用glDrawArrays、glDrawElements等一些需要顶点数据的函数时,信息是从一个带有本地GPU的高性能系统中的应用程序内存中获取的,数据将从应用程序的内存中通过PCI-Express接口总线传递到GPU本地内存[11],将会耗费大量时间,降低应用程序的运行速度。   如果将对象的所有顶点数据打包到单个缓冲区中,程序中必定包含循环,会产生很多OpenGL调用,每次调用都会有一定的系统开销。如果场景中存在大量对象,每个对象都有相关的三角形,那么对glDrawArrays的调用中的开销将会积累,从而对应用程序性能产生负面影响。   为了提高系统的处理效率,可以将大批非连接的三角形组合成三角形带,如图1所示。本来独立的三角型需要3个顶点才能进行表示,经过组合之后每个三角形所需的顶点数减少到1个(不包含三角形带中的第一个三角形)。这样需要处理的集合数据更少了,系统运行速度会更快。   但是问题是,一个三角形可以通过单次调用glDrawArrays或者glDrawElements进行渲染,一组三角形带的渲染就要单独对OpenGL进行多次调用,这意味着在一个使用条带化集合图形的程序中有更多的函数,这可能会抵消使用条带化所获得的性能提升。所以针对条带化处理应该有更好的方法来提高系统的性能,文中提出了基元重启算法。   2.2基元重启   基元重启是设定一个可以被OpenGL状态机识别的数据值,该数据值用于标识当前图形图元已经绘制完成。下一个数据项表示同样类型的另一个图形图元开始。基元重启应用在GL_TRIANGLE_TRIP、GL_TRIANGLE_FAN、GL_LINE_STRIP和GL_LINE_LOOP几何图形类型中。方法在一个条带(或者扇,环)结束和另一个开始时通知OpenGL。在几何图形中指示出一个条带结束,下一个条带的开始位置,实现时需要在元素数组中放置一个作为保留值的特殊标志。由于OpenGL是从元素数组中获取顶点索引(或者在内部生成它们),在glDrawArrays非索引绘制命令情况下,会检查这个特殊索引值,并且在遇到它时结束当前条带并在下一个顶点开始一个新的条带。在基元重启模式开启时,OpenGL会在遇到它时停止当前的条带并开始一个新的条带。   如图2所示,三角形带由9个顶点组成,在单个连接的三角形带中一共产生了8个三角形。通过开启基元重启模式并将基元重启索引设置为5,三角形带会在顶点4处结束,如图3所示。顶点5的实际位置将被忽略,下一个进行处理的顶点6将称为新的三角形带的起始位置。所以,在向OpenGL传递9个顶点的情况下,得到两个独立的三角形带,一个绘制3个三角形,

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档