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

How to effectively pass the same vertices to pyopengl many times?

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

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

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

这有可能吗?

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

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

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