我正在用Pyopengl渲染一些风景。一切正常,但对于每一帧我都需要以一种方式将所有顶点传递给opengl:
for object in objects:
for face in object:
for vertex in face:
glBegin(GL_QUADS)
glVertex3f(vertex)
glEnd()
有没有办法避免静态对象的三个循环?我想只传递一次顶点,然后在下一帧中调用应该再次渲染的对象的引用(以类似于纹理的方式)。
这有可能吗?
答案 0 :(得分:2)
是的,这绝对是可能的。事实上,您使用的整个API部分(glBegin/glEnd
)已于2009年从OpenGL 3.2 Core Profile中删除。
使用OpenGL 3.2+核心时,您必须将所有顶点信息存储在GPU上的顶点缓冲区对象(VBO)中。然后在发出绘图命令时使用此预加载的数据。
答案 1 :(得分:2)
作为替代方案,如果出于某些疯狂的原因,您必须使用已弃用的固定功能代码,并且您还没有准备好转向使用VBO(我强烈建议使用它,但需要一些工作才能最初习惯) ,你可以看一下Display Lists。使用显示列表,您只需要在第一次创建列表时执行这些循环,并且可以在需要再次使用该组绘图命令时使用glCallList
。这至少可以在每帧中保存python中重复的顶点循环,但绝对不是最好的解决方案。