Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用VBOs_Python_Opengl - Fatal编程技术网

在python中使用VBOs

在python中使用VBOs,python,opengl,Python,Opengl,我正在尝试使用VBOs优化我的opengl应用程序,现在它可以使用顶点数组完美地工作,但当我在中使用VBOs时,不会渲染任何内容,也不会引发任何异常。我看到的所有教程都使用类似的方法。 下面是上载和渲染这些VBO的代码 def uploadToVRAM(self): usage = GL_STATIC_DRAW if self.vertices_VBO == None: self.vertices_VBO = glGenBuffers(1) glB

我正在尝试使用VBOs优化我的opengl应用程序,现在它可以使用顶点数组完美地工作,但当我在中使用VBOs时,不会渲染任何内容,也不会引发任何异常。我看到的所有教程都使用类似的方法。 下面是上载和渲染这些VBO的代码

    def uploadToVRAM(self):
    usage = GL_STATIC_DRAW
    if self.vertices_VBO == None:
        self.vertices_VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, self.vertices_VBO)
    glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.vertices), ADT.voidDataPointer(self.vertices), usage)
    #glBufferData(GL_ARRAY_BUFFER, self.vertices, usage)
    #print "Bytes:",ADT.arrayByteCount(self.vertices)

    if self.normals != None:
        if self.normals_VBO == None:
            self.normals_VBO = glGenBuffers(1)
        glBindBuffer(GL_ARRAY_BUFFER, self.normals_VBO)
        glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.normals), ADT.voidDataPointer(self.normals), usage)
        #glBufferData(GL_ARRAY_BUFFER, self.normals, usage)

    if self.colors != None:
        if self.colors_VBO == None:
            self.colors_VBO = glGenBuffers(1)
        glBindBuffer(GL_ARRAY_BUFFER, self.colors_VBO)
        glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.colors), ADT.voidDataPointer(self.colors), usage)
        #glBufferData(GL_ARRAY_BUFFER, self.colors, usage)

    if self.uvs != None:
        if self.uvs_VBO == None:
            self.uvs_VBO = glGenBuffers(1)
        glBindBuffer(GL_ARRAY_BUFFER, self.uvs_VBO)
        glBufferData(GL_ARRAY_BUFFER, ADT.arrayByteCount(self.uvs), ADT.voidDataPointer(self.uvs), usage)
        #glBufferData(GL_ARRAY_BUFFER, self.uvs, usage)

    glBindBuffer(GL_ARRAY_BUFFER,0)
这是渲染部分:

    def renderVBOs(self, primitive):
        #active arrays
        glEnableClientState(GL_VERTEX_ARRAY)
        glBindBuffer(GL_ARRAY_BUFFER, self.vertices_VBO)
        glVertexPointer(3, GL_FLOAT, 0, 0) #offset in bytes

        if self.normals != None:
            glEnableClientState(GL_NORMAL_ARRAY)
            glBindBuffer(GL_ARRAY_BUFFER_ARB, self.normals_VBO)
            glNormalPointer(GL_FLOAT,0, 0)

        if self.colors != None:
            glEnableClientState(GL_COLOR_ARRAY)
            glBindBuffer(GL_ARRAY_BUFFER_ARB, self.colors_VBO)
            glColorPointer(4,GL_FLOAT,0, 0 )

        if self.uvs != None:
            glEnableClientState(GL_TEXTURE_COORD_ARRAY)
            glBindBuffer(GL_ARRAY_BUFFER_ARB, self.uvs_VBO)
            glTexCoordPointer(2,GL_FLOAT,0, 0 )
        glBindBuffer(GL_ARRAY_BUFFER_ARB,0)

        #render    
        glDrawArrays(primitive, 0, self.num_vertex)

        #clear
        glDisableClientState(GL_VERTEX_ARRAY)            
        if self.normals != None:
            glDisableClientState(GL_NORMAL_ARRAY)
        if self.colors != None:
            glDisableClientState(GL_COLOR_ARRAY)
        if self.uvs != None:
            glDisableClientState(GL_TEXTURE_COORD_ARRAY)
        glBindBuffer(GL_ARRAY_BUFFER_ARB,0)

通过查看您的代码,我注意到一个可能的问题:

  • 在数据上传中,您不使用GL常量的ARB变量(与渲染时一样)
  • 在调用
    glDrawArrays

  • 如果这不能帮助我们尝试制作一个最小的可运行示例,我们可以使用它来使其工作。

    我尝试了这两种方法,但都不起作用。因为我更改了几次,所以取消绑定是因为我不想对索引使用任何VBO。我将尝试制作一个最小版本。感谢您的帮助。这两点都无关紧要,因为数组绑定仅用于gl…指针调用,并且常量通常具有相同的值(至少在这个扩展中是这样)。我看到的唯一一件事是对GLGENBUSTER的调用。真正的GL函数的工作原理类似于glGenBuffers(count,*buffers),但我假设在Python中您的代码可以工作。