2013-09-25 19 views
0

我从OpenGL Programming Guide学习的OpenGL,并有一个立方体工作的一个简单的3D视图。我知道使用VBOs应该有助于提高性能,并且希望修改我的代码以使用它们。我在解决这个问题方面遇到了困难,而且还没有真正在网上找到很好的例子。重构使用OpenGL维也纳组织

这里就是我有工作。

我进口:

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) 

重构这个使用维也纳组织,我已经将其添加到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) 

而改为绑定维也纳组织抽奖:

# 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) 

我也试图把在维也纳组织只有位置和法线,独自离开faces。我也尝试在glDrawElements中使用0代替None

还有一个类似的问题here,除了它不使用在PyOpenGL中可用的vbo.VBO包装。

回答

0

你缺少一个glEnableClientState(GL_INDEX_ARRAY)来激活使用索引指针。

+0

好吧,我补充说,现在我得到一个“无效Enumerant”的错误,为glIndexPointer。任何其他线索? –

+0

嗯,我错了。 glIndexPointer在这里根本不需要。它有一个完全不同的目的(颜色索引...)。尝试删除glIndexPointer行。将缓冲区绑定到GL_ELEMENT_ARRAY_BUFFER对于glDrawElements来说是足够的。 – kakTuZ

+0

我尝试使用交错阵列取得了一些进展。似乎VBO的顶点数据和正常数据必须在一个单一的结构中 - 至少这是我从那里出乎意料的少数例子收集到的。然而,我并不完全正确,因此本周不得不搁置一旁。 –