加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 并行构建OpenGL模型?

发布时间:2020-12-16 10:50:20 所属栏目:百科 来源:网络整理
导读:我有一个程序可以绘制一些地形并模拟流过它的水(以便宜又简单的方式). 使用OpenMP更新水很容易并行化,因此我每秒可以进行约50次更新.问题是,即使用少量的水,我的每秒抽吸量也非常低(从5开始,一旦有大量的水就下降到2左右). 这对视频卡来说不是问题,因为地形
我有一个程序可以绘制一些地形并模拟流过它的水(以便宜又简单的方式).

使用OpenMP更新水很容易并行化,因此我每秒可以进行约50次更新.问题是,即使用少量的水,我的每秒抽吸量也非常低(从5开始,一旦有大量的水就下降到2左右).

这对视频卡来说不是问题,因为地形更加复杂并且绘制得如此之快以至于boost :: timer告诉我,如果我关掉水,我每秒都会得到无限远.它可能与内存带宽有关(因为我假设模型保留在卡上而不必每次都被转移).

我关心的是,在每次抽奖时,我称glVertex3f()大约一百万次(最大尺寸为450 * 600,每个顶点4个),并且完全按顺序完成,因为Glut不会让我调用任何东西在平行下.

那么..是否有某种方法可以并行构建列表然后将其一次性传递给OpenGL?或者其他一些方法让它更快地画出来?我使用了错误的方法(除了明显的“使用较少的顶点”)?

解决方法

您并行绘制的方法与您应该做的完全相反.
图形硬件本质上是并行的,并且尝试在很短的时间内尽可能多地调用它就没有多大用处.重要的是进行单个大量调用,将数据发送到可以进行并行处理的硬件.你所有的glVertex()调用恰恰相反.

正如Georg指出的那样:伴随glDrawElements()或glDrawArrays()的glVertexPointer()非常适合您的情况,如果这些还不够,您应该采取升级到顶点缓冲对象.另一种方法是使用着色器直接计算GPU.在所有这些方法中,你几乎可以免费获得GPU中的并行性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读