OpenGL:绘制三角形和四边形混合的最快方法是什么?

3
我有一个网格数据结构,其中多边形可以是三角形和四边形。使用OpenGL绘制它的最快方法是什么?
慢的方法是遍历整个结构,并为每个多边形使用适当的glBegin()..glEnd(),使用GL_QUADSGL_TRIANGLES。我想避免为每个多边形都做glBegin()..glEnd()
另一种选择是将结构分成两个结构,一个包含三角形,一个包含四边形,然后分别处理它们。这也是我想避免的,因为我真的想将它们都放在一个单一的结构中。
不幸的是,在这个时候,将四边形分割成三角形并不是一个选项。
是否有好的解决方案?

“每个多边形”是指每个三角形,还是指由三角形和四边形组成的每个网格? - Viktor Sehr
3个回答

3
你可以随时将它们全部转换为三角形,而且也很容易。
基本上,伪代码看起来应该是这样的:
glBegin(GL_TRIANGLES);
for each (object *a in objectList)
  if (a->type == TRIANGLE)
    glVertex3fv(a->vertices);
  if (a->type == QUAD)
  {
    glVertex3f(a->vertices[0]);
    glVertex3f(a->vertices[1]);
    glVertex3f(a->vertices[2]);

    glVertex3f(a->vertices[2]);
    glVertex3f(a->vertices[1]);
    glVertex3f(a->vertices[3]);
  }
glEnd();

您需要注意保持它们的方向相同(顺时针或逆时针),但这应该可以工作!


问题在于,如果我使用glPolygonMode(GL_LINE)绘制它,会出现一条对角线。我想我曾经知道如何避免这种情况... - shoosh
有一种不绘制内部边缘的技巧,但我完全想不起来了... - Andrei Krotkov
3
使用glBegin()glEnd()将保证这不会是最快的方法。 - Xavier Ho

3
您可能需要创建两个索引表,一个用于四边形,另一个用于三角形,然后按先四边形后三角形(或相反)的顺序写入所有四边形和三角形。要使用索引数组绘制,请使用glDrawElements以及一组glVertexPointerglEnableClientState来使其工作。

此外,如果您真的想提高速度,可以将所有顶点和索引都放在VBO中。这样您就可以让所有顶点和索引都储存在GPU的RAM中。


1
作为一个推论:使用OpenGL减少glXXX调用的数量通常会提高速度。如果可能的话,您还应该使用_STRIP绘图模式。 - Dolphin

2

如果涉及到glPolygonMode(GL_LINE)和分解的GL_QUADS,那么你需要使用glEdgeFlagPointer()功能。GL_TRUE表示边缘线段,GL_FALSE表示四边形对角线。

不要忘记启用glEnableClientState(GL_EDGE_FLAG_ARRAY)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接