我在Python中使用PyOpenGL绑定OpenGL。我在.stl文件中有几何数据,我读取文件并创建一个具有以下形式的数据vertices
:
vertices = [ -0.8528478 4.046846 -1.,.., -1.441251 -1.07833 10.85 ]
或:
vertices = [[ -0.8528478 4.046846 -1. ]
[ 5.244714 7.080829 -1. ]
...,
[ -1.596363 -0.8316395 10.85 ]
[ -1.441251 -1.07833 10.85 ]]
两种情况下的数据相同,差异仅在于形状。我使用geometry()
:
model_loader
的VBO
def geometry(self):
glEnable(GL_VERTEX_ARRAY)
# generate a new VBO and get the associated vbo_id
id = 1
# bind VBO in order to use
glBindBuffer(GL_ARRAY_BUFFER, self.vbo_id)
# upload data to VBO
vertices = model_loader.Model_loader(filename = "body.stl").vertices
self.N_vertices = len(vertices)
# data size in bytes
dataSize = arrays.ArrayDatatype.arrayByteCount(vertices)
print "dataSize =", dataSize
glBufferData(GL_ARRAY_BUFFER, dataSize, vertices, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, self.vbo_id)
绘图在方法paintGL
中完成:
def paintGL(self):
"""
display geometry
"""
# Clear the screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# setup camera
glMatrixMode(GL_MODELVIEW)
glLoadMatrixf(self.camera.currentMatrix)
glPushMatrix() #we don't want each object to move the camera
glTranslatef(-10, 0, 0)
# light
glLightfv(GL_LIGHT0, GL_POSITION, np.array([0.0, 100.0, -100.0]))
glLightModeli( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE )
glColor4f(1, 1, 1, 1)
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3,
GL_FLOAT,
0,
0)
glBindBuffer(GL_ARRAY_BUFFER, self.vbo_id)
glDrawArrays( GL_TRIANGLES,
0,
self.N_vertices )
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0) # reset
glDisableClientState(GL_VERTEX_ARRAY)
glPopMatrix()
问题是,如果我更改为GL_POINTS
并且使用GL_TRANGLES
时没有显示任何内容,则只显示一个点!
在使用VBO之前,我只使用glDrawArrays()
显示几何体,并显示几何体没有问题(没有错误)。但是当试图实现VBO时,它无法正常工作。怎么解决?
答案 0 :(得分:0)
我已经解决了这个问题。如果其他人有类似的问题,这里是解决方案。因为我使用的是64位版本的python(包括numpy)。 vertices
的类型为numpy.array(),类型为(dtype)float64
。
我改变了模型加载器中的行:
self.vertices = np.array(self.vertices)
为:
self.vertices = np.array(self.vertices, dtype='float32')
基于此我会说(较旧的)GPU仅支持float32。或者GPU支持float64?如果有人能澄清这一点,那就太好了。