我正在从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 *
在初始化中,我有:
# 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)
要重构这个以使用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)
我也尝试过只在VBO中放置位置和法线,然后单独留下faces
。我也尝试在glDrawElements中使用0而不是None
。
有一个类似的问题here,除了它不使用PyOpenGL中可用的vbo.VBO
包装器。
答案 0 :(得分:0)
您缺少glEnableClientState(GL_INDEX_ARRAY)来激活索引指针的使用。