自从OpenGL 3.1及以上版本中移除了GL_QUADS,没有使用它的情况下绘制大量矩形的最快方法是什么?我尝试了几种不同的方法(如下),并在我的机器上对它们的速度进行了排名,但我想知道是否有更好的方法,因为最快的方法似乎仍然是浪费和不优雅的。需要注意的是,在每种方法中,我都使用具有交错顶点和纹理坐标的VBO,因为我认为这是最佳实践(虽然我可能是错误的)。此外,我还要说一句,不能在不同的矩形之间重用任何顶点,因为它们将具有不同的纹理坐标。
- 使用具有原始重启索引的GL_TRIANGLE_STRIP的glDrawElements,使索引数组看起来像{0, 1, 2, 3, PRI, 4, 5, 6, 7, PRI, ...}。这会从我的VBO中取出前4个顶点,将它们视为三角形条形以制作矩形,然后将接下来的4个顶点视为单独的条带。问题在于索引数组似乎是一个空间浪费。GL_QUADS在早期的OpenGL版本中的好处是它会自动在每4个顶点之间重启原语。尽管如此,这仍然是我能找到的最快方法。
- 几何着色器。我为每个矩形传入1个顶点,然后在着色器中构建适当的由4个顶点组成的三角形带。这似乎是最快和最优雅的方法,但我已经阅读并现在看到,与传递冗余数据相比,几何着色器的效率不高。
- 使用GL_TRIANGLES的glDrawArrays。我只是独立地绘制每个三角形,不重用任何顶点。
- 使用具有GL_TRIANGLE_STRIP的glMultiDrawArrays,"first"数组的所有倍数为4,并且"count"数组的许多元素为4。这告诉显卡从0开始绘制第一个4,然后从4开始绘制第一个4,依此类推。我认为这样缓慢的原因是无法在VBO中放置这些索引数组。