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

时间:2009-06-11 08:41:29

标签: performance opengl graphics geometry

我有一个带有多边形的网格数据结构,可以是三角形和四边形。使用OpenGL绘制它的最快方法是什么?

缓慢的方法是迭代结构和每个多边形,以使用glBegin() .. glEnd()GL_QUADS生成相应的GL_TRIANGLES。我想避免为每个多边形做glBegin() .. glEnd()

另一种选择是将结构分成两个结构,一个包含三角形,另一个包含四边形,然后分别重复它们。这也是我想避免的,因为我真的想把它们全部保存在一个结构中。

不幸的是,将四边形三角化为三角形不是一种选择。

这有一个很好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

您可能想要创建两个indice表,一个用于四边形,一个用于三角形,然后写入所有Quad,后跟三角形(或反向)。要使用索引数组进行绘制,请使用glDrawElementsglVertexPointer以及glEnableClientState来使其正常工作。

此外,如果你真的想要提高速度,你可以将所有顶点放在VBO和你的指示中。这样就可以在GPU的RAM上获得所有顶点和索引。

答案 1 :(得分: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();

你必须小心保持它们的方向相同(顺时针或逆时针),但它应该有效!

答案 2 :(得分:2)

就glPolygonMode(GL_LINE)和分解的GL_QUADS而言,glEdgeFlagPointer()应该是您正在寻找的功能。周边区段的GL_TRUE,四边形对齐线上的GL_FALSE。

不要忘记glEnableClientState(GL_EDGE_FLAG_ARRAY)。