OpenGL VBO绘画顺序

时间:2011-12-04 06:55:47

标签: opengl vbo

我打算使用VBO来显示512x512左右的大点数组。为了显示它,每个顶点取决于它最近的邻居。例如,如果我有下表:

[ 1, 2, 3, 5, 6, 7
  8, 9,10,11,12,13,
 14,15,16,17,18,19]

我想用第5点绘制一个多边形,我将不得不使用以下代码:

glBegin(GL_TRIANGLE_STRIP)
glVertex(Points5)
glVertex(Points6)
glVertex(Points11)
glVertex(Points12)
glEnd()

依此类推任何其他观点..

我知道在任何特定时刻我的缓冲区只能保持512x512点,但是如何使用GL_TRIANGLE_STRIP和VBO“教”它以特定的方式绘制?

2 个答案:

答案 0 :(得分:2)

我认为最好的解决方案是使用索引(GL_ELEMENT_ARRAY_BUFFER)缓冲区以索引表示基元。 ref

修改

我无法从你的问题中得知,但你可能想调查退化的三角形条带(添加简并三角形)以避免过度的绘制调用。

答案 1 :(得分:0)

首先不要为每个单独的四边形绘制单独的三角形条!将这些四边形中的每一个分成两个三角形,并将这些三角形的所有顶点索引放入单个索引数组/缓冲区中,就像Brett Hale建议的那样。这样,您只需调用glDrawElements(GL_TRIANGLES, ...)即可绘制整个网格。

如果你不知道索引数组是什么,或者一般是顶点数组/缓冲区是什么,那么你应该深入研究一下这个主题。但无论如何,请远离当前为每个四边形绘制单个条带的解决方案。一开始可能听起来很棒(关于要发送的顶点的数量),但事实并非如此。请记住,VBO的优势不仅仅在于可能的GPU存储,而且还有一个事实,即您不需要为每个单独的原语调用驱动程序,而且您当前的解决方案只能以这种方式完成。

您也可以使用GL_QUADS代替GL_TRIANGLES。这样,你仍然只需要每个四边形4个索引(与使用三角形时的6个相比),并且仍然可以在一次调用中绘制它。但请记住,GL_QUADS已从新的OpenGL版本(3+)和ES的核心配置文件中删除。所以GL_TRIANGLES可能是一个更便携的解决方案(无论如何GPU都会将其分成三角形)。