2009-06-11 182 views
3

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

缓慢的方法是迭代结构和每个多边形,以使10或GL_TRIANGLES为合适的glBegin() .. glEnd()。我想避免必须为每个多边形执行glBegin() .. glEnd()

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

不幸的是,将四边形三角形分成三角形不是目前的选择。

有没有很好的解决方案呢?

+0

“每个多边形”,你的意思是每个三角形\ quad,或者你是指每个由三角形和四边形组成的网格? – 2010-06-29 21:20:46

回答

3

您可能需要创建两个指示表,一个用于三角形四边形,然后写入所有四边形,然后是三角形(或反转)。要使用索引数组进行绘制,请使用glDrawElementsglVertexPointerglEnableClientState以使其起作用。

此外,如果你真的想获得速度,你可以把所有的顶点放在一个VBO和你的指针。这样你就可以获得GPU内存上的所有顶点和索引。

+1

作为推论:使用OpenGL减少glXXX调用的次数通常会提供加速。 如果可能,您还应该使用_STRIP绘图模式。 – Dolphin 2009-06-11 19:59:26

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(); 

你必须要小心,让他们面向同样的方式(顺时针或逆时针),但它应该工作!

+0

这个问题是,如果我用glPolygonMode(GL_LINE)绘制它,会出现一条对角线。 – shoosh 2009-06-13 00:52:42

1

至于glPolygonMode(GL_LINE)和分解的GL_QUADS go,glEdgeFlagPointer()应该是您正在查找的功能。 GL_TRUE用于四边形线段,GL_FALSE用于四边形对角线。

不要忘记glEnableClientState(GL_EDGE_FLAG_ARRAY)。