如何使用glDrawArrays()与VBO - Vertex Buffer Object来显示.stl几何

时间:2013-11-26 18:33:18

标签: python opengl pyopengl

我在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()

从.stl文件创建方法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时,它无法正常工作。怎么解决?

1 个答案:

答案 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?如果有人能澄清这一点,那就太好了。