PyOpenGL渲染优化

时间:2014-05-26 13:36:31

标签: python opengl pyopengl

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

这是我的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的使用?

1 个答案:

答案 0 :(得分: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等来电。这样可以让您的绘图效率更高。