首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行构建OpenGL模型?

并行构建OpenGL模型?
EN

Stack Overflow用户
提问于 2010-05-17 06:50:27
回答 4查看 816关注 0票数 3

我有一个程序,绘制一些地形和模拟水流过它(以一种廉价和简单的方式)。

使用OpenMP可以很容易地并行更新水,所以我每秒可以进行大约50次更新。问题是,即使有少量的水,我每秒的绘制速度也非常非常低(从5开始,一旦有大量的水,就会下降到2左右)。

这不是显卡的问题,因为地形更复杂,绘制速度如此之快,以至于boost::timer告诉我,如果我关掉水,每秒就会有无穷多的绘制。这可能与内存带宽有关(因为我假设模型留在卡上,不需要每次都传输)。

我关心的是,在每次绘制时,我都会调用glVertex3f()大约一百万次(最大大小为450*600,每个顶点4个顶点),而且它完全是按顺序完成的,因为Glut不允许我并行调用任何东西。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-17 07:10:08

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

正如格奥尔格所指出的:带有glDrawElements()glDrawArrays()glVertexPointer()非常适合您的情况,如果这些还不够,您应该使用顶点缓冲区对象。另一种方法是使用着色器直接在GPU中进行计算。在所有这些方法中,你几乎可以免费获得GPU中的并行性。

票数 8
EN

Stack Overflow用户

发布于 2010-05-17 06:59:17

我担心的是,在每次抽签时,我都会调用glVertex3f()大约一百万次

看看glVertexPointer()吧。

票数 7
EN

Stack Overflow用户

发布于 2010-05-17 07:58:23

除了glVertexPointer之外,您还应该看看ARB_vertex_buffer_object,它在大多数现代硬件上都受支持,并且在某些情况下可以比顶点数组更快。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2845793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档