我打算使用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“教”它以特定的方式绘制?
答案 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都会将其分成三角形)。