Python PyOpenGL渲染优化

Python PyOpenGL渲染优化,python,opengl,pyopengl,Python,Opengl,Pyopengl,我正在寻找一个优化我的代码,打印一个星球。事实上,我想旋转我的相机,看看我星球的不同部分,但它真的很慢很长 以下是我的pyOpenGL代码的一部分,用于打印我的不同对象: def _DrawGLScene(self): if not self.printed: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() # Camera movements glTr

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

以下是我的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()
仅绘制一个三角形对象列表,其中有自己的
draw\u 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

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

您可以使用不同级别的优化

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

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()
要将整个过程提升到一个新的水平,您需要研究更现代的方法。您当前使用的调用,如
glBegin
glEnd
glVertex
通常被称为“即时模式”绘图,在较新的OpenGL版本中不推荐使用

如果搜索“顶点缓冲区对象”(主要缩写为“VBO”)和“顶点数组对象”(“VAO”)等术语,您应该能够找到有关如何使用这些功能的良好教程。您将使用诸如
glGenBuffers
glBindBuffer
glgenvertexarray
glbinvertexarray
glvertexattributepointer
等调用。它们将使您的绘图更加高效