我有一个带有多边形的网格数据结构,可以是三角形和四边形。使用OpenGL绘制它的最快方法是什么?
缓慢的方法是迭代结构和每个多边形,以使用glBegin() .. glEnd()
或GL_QUADS
生成相应的GL_TRIANGLES
。我想避免为每个多边形做glBegin() .. glEnd()
。
另一种选择是将结构分成两个结构,一个包含三角形,另一个包含四边形,然后分别重复它们。这也是我想避免的,因为我真的想把它们全部保存在一个结构中。
不幸的是,将四边形三角化为三角形不是一种选择。
这有一个很好的解决方案吗?
答案 0 :(得分:3)
您可能想要创建两个indice表,一个用于四边形,一个用于三角形,然后写入所有Quad,后跟三角形(或反向)。要使用索引数组进行绘制,请使用glDrawElements和glVertexPointer以及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)。