Python 使用OpenGL VBOs进行重构

Python 使用OpenGL VBOs进行重构,python,opengl,python-2.7,pyopengl,Python,Opengl,Python 2.7,Pyopengl,我正在从学习OpenGL,并且有一个立方体的简单3d视图。我知道使用VBOs应该有助于提高性能,并希望修改我的代码以使用它们。我很难做到这一点,而且还没有在网上找到好的干净的例子 这是我的工作 我的进口是: import numpy as np from OpenGL.GL import * from OpenGL.arrays import vbo from OpenGL.GLU import * from OpenGL.GLUT import * 在我的初始化中,我有: # Un

我正在从学习OpenGL,并且有一个立方体的简单3d视图。我知道使用VBOs应该有助于提高性能,并希望修改我的代码以使用它们。我很难做到这一点,而且还没有在网上找到好的干净的例子

这是我的工作

我的进口是:

import numpy as np

from OpenGL.GL import *
from OpenGL.arrays import vbo
from OpenGL.GLU import *
from OpenGL.GLUT import *
在我的初始化中,我有:

    # Unit cube, centered at the origin.
    self.positions = np.array([(0.5, -0.5, -0.5), (0.5, 0.5, -0.5),
                               (0.5, 0.5, 0.5), (0.5, -0.5, 0.5),
                               (-0.5, 0.5, -0.5), (-0.5, -0.5, -0.5),
                               (-0.5, -0.5, 0.5), (-0.5, 0.5, 0.5),
                               (-0.5, 0.5, -0.5), (-0.5, 0.5, 0.5),
                               (0.5, 0.5, 0.5), (0.5, 0.5, -0.5),
                               (-0.5, -0.5, 0.5), (-0.5, -0.5, -0.5),
                               (0.5, -0.5, -0.5), (0.5, -0.5, 0.5),
                               (-0.5, -0.5, 0.5), (0.5, -0.5, 0.5),
                               (0.5, 0.5, 0.5), (-0.5, 0.5, 0.5),
                               (0.5, -0.5, -0.5), (-0.5, -0.5, -0.5),
                               (-0.5, 0.5, -0.5), (0.5, 0.5, -0.5)],
                              dtype=np.float32)
    self.normals = np.array([(1.0, 0.0, 0.0), (1.0, 0.0, 0.0),
                             (1.0, 0.0, 0.0), (1.0, 0.0, 0.0),
                             (-1.0, 0.0, 0.0), (-1.0, 0.0, 0.0),
                             (-1.0, 0.0, 0.0), (-1.0, 0.0, 0.0),
                             (0.0, 1.0, 0.0), (0.0, 1.0, 0.0),
                             (0.0, 1.0, 0.0), (0.0, 1.0, 0.0),
                             (0.0, -1.0, 0.0), (0.0, -1.0, 0.0),
                             (0.0, -1.0, 0.0), (0.0, -1.0, 0.0),
                             (0.0, 0.0, 1.0), (0.0, 0.0, 1.0),
                             (0.0, 0.0, 1.0), (0.0, 0.0, 1.0),
                             (0.0, 0.0, -1.0), (0.0, 0.0, -1.0),
                             (0.0, 0.0, -1.0), (0.0, 0.0, -1.0)],
                            dtype=np.float32)

    self.faces = np.array(range(24), dtype=np.uint32)
在我的绘图代码中:

    # 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)
要将其重构为使用VBOs,我已将其添加到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中只放置位置和法线,而不使用
面。我还尝试在gldrawerelements中使用0而不是
None


还有一个类似的问题,除了它没有使用PyOpenGL中可用的
vbo.vbo
wrappers。

您缺少一个glEnableClientState(GL\u INDEX\u数组)来激活索引指针的使用。

好的,我添加了它,现在glIndexPointer出现了一个“Invalid Enumerant”错误。还有其他线索吗?嗯,我错了。这里根本不需要glIndexPointer。它有完全不同的用途(颜色索引…)。尝试移除glIndexPointer线路。将缓冲区绑定到GL\u元素\u数组\u缓冲区就足够glpaurements使用它了。我在尝试使用交错数组时取得了一些进展。对于VBO来说,顶点和法线数据似乎必须在一个单一的结构中——至少这是我从为数不多的几个例子中收集到的。然而,我还没有完全弄对,不得不把它放在一边,等待这周。