我在Python中使用OpenGL的PyOpenGL绑定。我在.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 ]]
这两种情况下的数据都是一样的,只是形状不同而已。我使用model_loader
:从.stl文件创建方法geometry()
的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时,它不起作用。如何解决?
我已经解决了这个问题。如果其他人也会遇到类似的问题,这里是解决方案。因为我使用的是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?如果有人能澄清这一点,那就太好了。