我正在从OpenGL Programming Guide学习OpenGL,并有一个立方体工作的简单三维视图。我知道使用vbo应该有助于提高性能,我想修改我的代码来使用它们。我很难让这个工作,并没有真正找到好的干净的例子在网上。在
这是我的工作。在
我的进口是:import numpy as np
from OpenGL.GL import *
from OpenGL.arrays import vbo
from OpenGL.GLU import *
from OpenGL.GLUT import *
在我的初始化中,我有:
^{pr2}$
在我的绘图代码中:# clear color and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_NORMAL_ARRAY)
# self.position_vbo.bind()
glVertexPointer(3, GL_FLOAT, 0, self.positions)
# self.normal_vbo.bind()
glNormalPointer(GL_FLOAT, 0, self.normals)
glColor3f(0., 1., 0.)
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, self.faces)
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
为了重构它以使用vbo,我在init中添加了以下内容:self.position_vbo = vbo.VBO(self.positions)
self.normal_vbo = vbo.VBO(self.normals)
self.faces_vbo = vbo.VBO(self.faces, target=GL_ELEMENT_ARRAY_BUFFER)
并更改绘图以绑定VBO:# clear color and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_NORMAL_ARRAY)
self.position_vbo.bind()
glVertexPointer(3, GL_FLOAT, 0, 0)
self.normal_vbo.bind()
glNormalPointer(GL_FLOAT, 0, 0)
self.faces_vbo.bind()
glIndexPointer(GL_UNSIGNED_INT, 0, 0)
glColor3f(0., 1., 0.)
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, None)
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_NORMAL_ARRAY)
我还尝试在VBOs中只放置位置和法线,而不使用faces。我还尝试在gldrawerElements中使用0而不是None。在
还有一个类似的问题here,只是它没有使用PyOpenGL中可用的vbo.VBO包装。在