【问题标题】:PyOpenGL rendering optimizationPyOpenGL 渲染优化
【发布时间】:2014-07-15 07:17:35
【问题描述】:

我正在寻找我的代码的优化,它打印一个星球。实际上,我想旋转我的相机来看看我星球的不同部分,但它真的很慢而且很长。

这是我的 pyOpenGL 代码的一部分,用于打印我的不同对象:

def _DrawGLScene(self):
    if not self.printed:
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
    # Camera movements
    glTranslatef(0.0, 0.0, self.move_z)
    glRotatef(self.rx, 1.0, 0.0, 0.0)
    glRotatef(self.ry, 0.0, 1.0, 0.0)
    glRotatef(self.rz, 0.0, 0.0, 1.0)
    # Print objects
    if not self.printed:
        self.planet.draw()
        self.printed = True
    glutSwapBuffers()

self.planet.draw() 方法只绘制一个 Triangle 对象列表,其中定义了自己的draw_triangle 方法:

def draw_triangle(self):
    glBegin(GL_POLYGON)
    glColor3f(self.color_a[0], self.color_a[1], self.color_a[2])
    glVertex3f(self.point_a[0], self.point_a[1], self.point_a[2])
    glColor3f(self.color_b[0], self.color_b[1], self.color_b[2])
    glVertex3f(self.point_b[0], self.point_b[1], self.point_b[2])
    glColor3f(self.color_c[0], self.color_c[1], self.color_c[2])
    glVertex3f(self.point_c[0], self.point_c[1], self.point_c[2])
    glEnd()
    return

当我旋转相机时,我必须重新绘制所有三角形,这对于 100,000 个三角形来说真的很慢。如何优化 OpenGL 的使用?

【问题讨论】:

    标签: python opengl pyopengl


    【解决方案1】:

    您可以使用各种级别的优化。

    一个可能已经对您有很大帮助的非常简单的更改是您不应该在每个三角形周围放置glBegin(..)glEnd()。使用GL_TRIANGLES 而不是GL_POLYGON 作为原始类型也可能是有益的。听起来您的代码结构目前看起来像这样:

    draw_triangle
        glBegin(GL_POLYGON)
        // specify colors, vertices
        glEnd()
    
    draw
        loop over triangles
            draw_triangle
    

    你应该做的是:

    draw_triangle
        // specify colors, vertices
    
    draw
        glBegin(GL_TRIANGLES)
        loop over triangles
            draw_triangle
        glEnd()
    

    要将整个事情提升到一个新的水平,您需要研究更现代的方法。您当前使用的调用,如glBeginglEndglVertex,通常被称为“即时模式”绘图,在较新的 OpenGL 版本中已弃用。

    如果您搜索“顶点缓冲区对象”(通常缩写为“VBO”)和“顶点数组对象”(“VAO”)等术语,您应该能够找到有关如何使用这些功能的优秀教程。您将使用glGenBuffersglBindBufferglGenVertexArraysglBindVertexArrayglVertexAttribPointer 等调用。它们将使您的绘图更加高效。

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2011-10-02
      • 2020-10-20
      • 2011-08-23
      • 2018-09-16
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多