如何将glDrawArrays()与VBO一起使用-顶点缓冲区对象来显示.stl几何体



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

最新更新