如何有效地将相同的顶点多次传递给pyopengl?

时间:2018-04-09 10:33:06

标签: python opengl pyopengl

我正在用Pyopengl渲染一些风景。一切正常,但对于每一帧我都需要以一种方式将所有顶点传递给opengl:

for object in objects:
    for face in object:
        for vertex in face:
            glBegin(GL_QUADS)
            glVertex3f(vertex)
            glEnd()

有没有办法避免静态对象的三个循环?我想只传递一次顶点,然后在下一帧中调用应该再次渲染的对象的引用(以类似于纹理的方式)。

这有可能吗?

2 个答案:

答案 0 :(得分:2)

是的,这绝对是可能的。事实上,您使用的整个API部分(glBegin/glEnd)已于2009年从OpenGL 3.2 Core Profile中删除。

使用OpenGL 3.2+核心时,您必须将所有顶点信息存储在GPU上的顶点缓冲区对象(VBO)中。然后在发出绘图命令时使用此预加载的数据。

答案 1 :(得分:2)

作为替代方案,如果出于某些疯狂的原因,您必须使用已弃用的固定功能代码,并且您还没有准备好转向使用VBO(我强烈建议使用它,但需要一些工作才能最初习惯) ,你可以看一下Display Lists。使用显示列表,您只需要在第一次创建列表时执行这些循环,并且可以在需要再次使用该组绘图命令时使用glCallList。这至少可以在每帧中保存python中重复的顶点循环,但绝对不是最好的解决方案。