【问题标题】:OpenGL: Fastest way to draw a mixture of triangles and quads?OpenGL:绘制三角形和四边形混合的最快方法?
【发布时间】:2009-06-11 08:41:29
【问题描述】:

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

缓慢的方法是迭代结构并为每个多边形生成适当的glBegin() .. glEnd()GL_QUADSGL_TRIANGLES。我想避免为每个多边形都做glBegin() .. glEnd()

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

不幸的是,目前无法将四边形三角剖分为三角形。

有什么好的解决办法吗?

【问题讨论】:

  • “每个多边形”是指每个三角形\四边形,还是指由三角形和四边形组成的每个网格?

标签: performance opengl graphics geometry


【解决方案1】:

您可能想要创建两个索引表,一个用于四边形,一个用于三角形,然后写入所有四边形,然后是三角形(或倒数)。要使用索引数组进行绘制,请将glDrawElements 与一组glVertexPointerglEnableClientState 一起使用以使其工作。

此外,如果您真的想提高速度,您可以将所有顶点放在VBO 中,然后将您的索引。这样您就可以在 GPU 的 RAM 上获取所有顶点和索引。

【讨论】:

  • 作为推论:使用 OpenGL 减少 glXXX 调用的数量通常会提供加速。如果可能,您还应该使用 _STRIP 绘图模式。
【解决方案2】:

您也可以很容易地将它们全部转换为三角形。

基本上伪代码看起来像这样:

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) 绘制它,就会有一条对角线。我想我曾经知道如何避免这种情况..
  • 有一种不绘制内部边缘的技术,但我完全忘记了......
  • 使用 glBegin()glEnd() 将保证这不是将是最快的方法。
【解决方案3】:

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

别忘了 glEnableClientState(GL_EDGE_FLAG_ARRAY)。

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 2023-03-28
    • 2012-09-23
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2020-12-08
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多