【问题标题】:opengl polygon vs triangle strip using display lists使用显示列表的opengl多边形与三角形条
【发布时间】:2016-04-06 22:30:58
【问题描述】:

(我使用的是 PyOpenGL,我的笔记本电脑运行的是 OpenGL 2.1)

我听说 OpenGL 绘制三角形比多边形快得多,但使用显示列表也可以减少开销。如果我现在在多边形(三角形和四边形等)中并使用glBegin(GL_TRIANGLE_STRIP)而不是glBegin(GL_POLYGON)进行绘制,如果我仍然使用显示列表,我会通过将我的模型转换为三角形条来获得任何速度吗?显示列表会自动对所有内容进行三角剖分吗?

我的模型有大约 50 个 obj 格式的面孔,列表是使用以下代码制作的:

treelist = glGenLists(1)
glNewList(treelist, GL_COMPILE)
for s in OBJ.treeobjs:
    for face in s.faces:
        verts, normals, texcoords = face

        glBegin(GL_POLYGON)
        for i in range(len(verts)):
            glNormal3fv(s.normals[normals[i]])
            if texcoords[i] > 0:
                glTexCoord2fv(s.texcoords[texcoords[i]])
            glVertex3fv(s.vertices[verts[i]])
        glEnd()
glEndList()

并使用:

glCalllist(treelist)

但如果我想将所有内容转换为三角形条带(在搅拌机中很容易进行三角测量),我将不得不使用与 obj 不同的格式?

【问题讨论】:

  • 有点迂腐,但是:OpenGL 绘制三角形的速度并不快于多边形,因为它是一种规范;它只定义发生了什么 API 调用做什么,并没有实现任何东西。也就是说,今天大多数硬件只渲染三角形,更复杂的形状被分解成三角形。如果您使用的是 OpenGL 2+,则应该使用顶点缓冲区而不是显示列表。
  • 顶点缓冲区是否包括使用 glDrawArrays? Wikipedia 中的 VBO 示例使用 glDrawArrays 和 glBindBuffer,但我可以单独使用 glDrawArrays。

标签: opengl polygon triangulation wavefront


【解决方案1】:

obj 格式不支持三角带。不要使用 GL_POLYGON 或显示列表,因为它们已被有效弃用。除非您有令人信服的性能原因,否则不要打扰三角形剥离。

假设您可以对搅拌机中的所有内容进行三角测量,将三角形加载到 VBO 中并通过 glDrawElements 进行索引渲染。如果您有很多模型要绘制,请尝试将您的模型合并为一个大 VBO。

【讨论】:

  • 三角形条比未优化的三角形列表更好。虽然优化的三角形列表通常可以击败条形,但您仍然必须优化该列表。
  • 我在 glDrawIndices 上找不到规范 - 这只是 glDrawArrays 和 glDrawElements 的另一个版本吗?
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
相关资源
最近更新 更多