我有一个程序,绘制一些地形和模拟水流过它(以一种廉价和简单的方式)。
使用OpenMP可以很容易地并行更新水,所以我每秒可以进行大约50次更新。问题是,即使有少量的水,我每秒的绘制速度也非常非常低(从5开始,一旦有大量的水,就会下降到2左右)。
这不是显卡的问题,因为地形更复杂,绘制速度如此之快,以至于boost::timer告诉我,如果我关掉水,每秒就会有无穷多的绘制。这可能与内存带宽有关(因为我假设模型留在卡上,不需要每次都传输)。
我关心的是,在每次绘制时,我都会调用glVertex3f()大约一百万次(最大大小为450*600,每个顶点4个顶点),而且它完全是按顺序完成的,因为Glut不允许我并行调用任何东西。
所以..。是否有某种方法可以并行地构建列表,然后将其一次性传递给OpenGL?或者其他让它画得更快的方法?我是否使用了错误的方法(除了明显的“使用更少的顶点”)?
发布于 2010-05-17 07:10:08
你的并行绘图方法与你应该做的完全相反。图形硬件本质上是并行的,在很短的时间内尝试尽可能多地调用它并没有太大的用处。重要的是,发出单个巨大的调用,将数据发送到硬件,在硬件上可以进行并行处理。所有的glVertex()调用都是完全相反的。
正如格奥尔格所指出的:带有glDrawElements()或glDrawArrays()的glVertexPointer()非常适合您的情况,如果这些还不够,您应该使用顶点缓冲区对象。另一种方法是使用着色器直接在GPU中进行计算。在所有这些方法中,你几乎可以免费获得GPU中的并行性。
发布于 2010-05-17 06:59:17
我担心的是,在每次抽签时,我都会调用glVertex3f()大约一百万次
看看glVertexPointer()吧。
发布于 2010-05-17 07:58:23
除了glVertexPointer之外,您还应该看看ARB_vertex_buffer_object,它在大多数现代硬件上都受支持,并且在某些情况下可以比顶点数组更快。
https://stackoverflow.com/questions/2845793
复制相似问题