Я пытаюсь оптимизировать свое приложение opengl с помощью VBO, сейчас оно отлично работает с использованием массивов вершин, но когда я использую VBO, ничего не рендерит и не выдает никаких исключений.Все учебники, которые я видел, используют похожие подходы.Вот код для загрузки и визуализации этих VBO.
def uploadToVRAM(self):
usage = GL_STATIC_DRAW
if self.vertices_VBO == None:
self.vertices_VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, self.vertices_VBO)
glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.vertices), ADT.voidDataPointer(self.vertices), usage)
#glBufferData(GL_ARRAY_BUFFER, self.vertices, usage)
#print "Bytes:",ADT.arrayByteCount(self.vertices)
if self.normals != None:
if self.normals_VBO == None:
self.normals_VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, self.normals_VBO)
glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.normals), ADT.voidDataPointer(self.normals), usage)
#glBufferData(GL_ARRAY_BUFFER, self.normals, usage)
if self.colors != None:
if self.colors_VBO == None:
self.colors_VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, self.colors_VBO)
glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.colors), ADT.voidDataPointer(self.colors), usage)
#glBufferData(GL_ARRAY_BUFFER, self.colors, usage)
if self.uvs != None:
if self.uvs_VBO == None:
self.uvs_VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, self.uvs_VBO)
glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.uvs), ADT.voidDataPointer(self.uvs), usage)
#glBufferData(GL_ARRAY_BUFFER, self.uvs, usage)
glBindBuffer(GL_ARRAY_BUFFER,0)
И это часть рендеринга:
def renderVBOs(self, primitive):
#active arrays
glEnableClientState(GL_VERTEX_ARRAY)
glBindBuffer(GL_ARRAY_BUFFER, self.vertices_VBO)
glVertexPointer(3, GL_FLOAT, 0, 0) #offset in bytes
if self.normals != None:
glEnableClientState(GL_NORMAL_ARRAY)
glBindBuffer(GL_ARRAY_BUFFER_ARB, self.normals_VBO)
glNormalPointer(GL_FLOAT,0, 0)
if self.colors != None:
glEnableClientState(GL_COLOR_ARRAY)
glBindBuffer(GL_ARRAY_BUFFER_ARB, self.colors_VBO)
glColorPointer(4,GL_FLOAT,0, 0 )
if self.uvs != None:
glEnableClientState(GL_TEXTURE_COORD_ARRAY)
glBindBuffer(GL_ARRAY_BUFFER_ARB, self.uvs_VBO)
glTexCoordPointer(2,GL_FLOAT,0, 0 )
glBindBuffer(GL_ARRAY_BUFFER_ARB,0)
#render
glDrawArrays(primitive, 0, self.num_vertex)
#clear
glDisableClientState(GL_VERTEX_ARRAY)
if self.normals != None:
glDisableClientState(GL_NORMAL_ARRAY)
if self.colors != None:
glDisableClientState(GL_COLOR_ARRAY)
if self.uvs != None:
glDisableClientState(GL_TEXTURE_COORD_ARRAY)
glBindBuffer(GL_ARRAY_BUFFER_ARB,0)