gpt4 book ai didi

python - PyOpenGL渲染优化

转载 作者:太空宇宙 更新时间:2023-11-03 18:22:20 28 4
gpt4 key购买 nike

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

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

最佳答案

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

一个非常简单的更改可能已经对您有很大帮助,那就是您不应该在每个三角形周围放置 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 等调用等等。它们将使您的绘图更加高效。

关于python - PyOpenGL渲染优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23871421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com