在OpenGL ES中绘制四边形的最快方法?


22

我正在使用OpenGL ES 2.0,我要绘制一堆四边形,希望能够像在使用GL_QUADS一样,每四边形仅传递4个顶点,但是基本上我只是想知道绘制一个四边形的最佳方法一堆单独的四边形。

到目前为止,我发现我可以做的是:-GL_TRIANGLES(每个四角形6个顶点)-退化GL_TRIANGLE_STRIP(每个四角形6个顶点)

我发现的可能性:-GL_TRIANGLE_STRIPS具有特殊的索引值,该值可重置四边形带(这意味着每个四边形5个索引,但是我不认为这是OpenGL ES 2.0)

Answers:


33

只需使用索引缓冲区和GL_TRIANGLES。在这种情况下,每个四极需要4个顶点+ 6个索引(6个额外的索引可能听起来开销很大,但实际上并非如此-一旦构建了索引缓冲区,就不必再次触摸它)。有关更多信息,请参见此页面(搜索glDrawElements)。

简单的示例代码:

GLfloat vertices[] = {-1, -1, 0, // bottom left corner
                      -1,  1, 0, // top left corner
                       1,  1, 0, // top right corner
                       1, -1, 0}; // bottom right corner

GLubyte indices[] = {0,1,2, // first triangle (bottom left - top left - top right)
                     0,2,3}; // second triangle (bottom left - top right - bottom right)

glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);

另外,如果只绘制一个四边形,则只需要4个顶点即可用三角形条纹进行绘制(如Wikipedia所示),但我想您已经知道这一点。


将多个三角形带合并为单个带的传统技巧是“退化三角形”:重复一个带的最后一个元素和下一个带的第一个元素会创建2个面积为零的三角形,因此什么也没画。考虑第二个四分之一索引(4、5、6、7)。两个象限的GL_TRIANGLE_STRIP的索引缓冲区可以是:{0、1、2、3、4、5、6、7 3, 4,}。退化的三角形是3,3,43,4,4。值得这样做吗?不,除非您的四边形倾向于与公共边成对(或更多)。如果第二四边形为{3,2,4,5},则条带为{0,1,3,2,5,4}
ToolmakerSteve

8
并且向那些需要绘制一堆四边形的人明确说明:为了性能起见,请勿复制以上代码,并请glDrawElements调用ONCE FOR EACH QUAD。而是建立一个包含所有要绘制的四边形的顶点数组和一个索引数组。使用GL_TRIANGLES,两个四边形可以具有索引{0,1,2, 0,2,3, 4,5,6, 4,6,7}或相等的is是{0,1,2, 2,3,0, 4,5,6, 6,7,4}。善类,以帮助这是glText-的Android / SpriteBatch
ToolmakerSteve

6

如Apple文档中所述,使用索引缓冲区并不一定会更快,“为了获得最佳性能,应使用glDrawArrays将模型作为单个未索引的三角条提交”

因此,尽管a GL_TRIANGLE_STRIP不需要索引缓冲区即可在4个顶点中完成此操作,并且您可以使用索引缓冲区,但是尝试“保存”重复的2个顶点非常la 。因此,建议您分别绘制GL_TRIANGLES2个并在对角线上重复2个顶点


8
不。该文档说的是,您的模型将作为单个INDEXED三角带提交。接下来的句子是:“为避免在顶点缓冲区中多次为同一顶点指定数据,请使用单独的索引缓冲区,并使用glDrawElements函数绘制三角形带。” 您确定的正是“ lam”。
davidf2281 2014年

3
鉴于doc段落现在引用的是glDrawElements而不是glDrawArrays,自此回答以来,它可能已被重写。然而,该文档被使点是,在性能,提供一个单一的条带(而不是多个条带,因此多个GL呼叫)。在这种情况下,我认为使用索引与不使用索引之间的差异不大;重要的是将所有内容放入单个顶点数组(以及可选的索引数组)中,以便您可以进行单个gl调用。
制造商

0

在桌面上最大的收获是将数据移到GL_STATIC_DRAW VBO中。大概在iPhone的MBX GPU上也是如此。


-2

使用GL_TRIANGLE_FAN了四利用4个顶点,而不是6。


是的,但GL_TRIANGLE_STRIP正如其他答案已指出的那样。
2014年

@先生。等等-你已经错过了问题,那就是如何有效地做点一堆四边形。一个人不应该对每个四边形进行gl调用,而应该将许多四边形组合成一个数组,可以通过一个gl调用来绘制。GL_TRIANGLE_FAN对此无济于事,因此在高性能渲染中很少有用。
制造商史蒂夫(Steve)2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.