在OpenGL中绘制数千行

时间:2014-05-07 10:06:45

标签: opengl

我一直在努力寻找一种在opengl中绘制数千行的方法,并尽可能减少性能损失。我必须绘制10000到100000个未连接的线,每个21点,我不知道如何解决这个问题。根据我在网上发现的内容,我应该尽量减少绘制调用的开销,也不要经常将数据发送到gpu。到现在为止,我尝试了一些事情:

  • 只使用一个VBO。

这样我只发送一次数据,但最终得到每条线的绘制调用,分隔为21点,如glDrawArrays(GL_LINE_STRIP, i * 21,21)在那里我迭代 i 获取行数。虽然这种方法有用,但似乎可以有一个更容易,更优雅的解决方案,没有那么多的绘制调用。

  • 为每一行使用不同的VBO。

我真的不认为这是一个好主意,它变得非常混乱,并且最终会有尽可能多的绘制调用。

有没有办法通过一次平局调用绘制数千行?如果没有,我该如何处理这个问题?

我正在使用OpenGL 3.3。

1 个答案:

答案 0 :(得分:1)

这个问题有2个部分。将数据上传到GPU并最小化drawcall。

首先通过更新单个VBO来解决它。如果您使用GL 4.4的扩展名ARB_buffer_storage,则可以改进它。使用该扩展,您可以使用持久映射再次使用单个VBO(x3倍于您想要的大小)。该扩展通过避免不必要的副本和同步(至少是扩展程序所宣传的内容)来最小化CPU负载。

第二个问题(最小化drawcalls)有点棘手。您可以使用上面注释中所述的原始重启,但这意味着具有索引缓冲区。通过原始重启,您可以使用行条(=更小的大小)并通过在索引缓冲区中随附一个魔术整数(=可在GL 3.3上配置)重新启动新的条带。您也可以尝试使用简单的线条而不是线条,但这会使您的缓冲区加倍。也许还有其他方法,如果我想到的话,我会编辑这条消息。