Использование VBO в Python - PullRequest
       3

Использование VBO в Python

0 голосов
/ 11 апреля 2011

Я пытаюсь оптимизировать свое приложение opengl с помощью VBO, сейчас оно отлично работает с использованием массивов вершин, но когда я использую VBO, ничего не рендерит и не выдает никаких исключений.Все учебники, которые я видел, используют похожие подходы.Вот код для загрузки и визуализации этих 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)

1 Ответ

0 голосов
/ 11 апреля 2011

Просматривая ваш код, я замечаю одну возможную и одну вероятную проблему:

  1. При загрузке данных вы не используете ARB-варианты констант GL (как вы делаете для рендеринга)
  2. Вы отменяете буфер массива перед вызовом glDrawArrays

Если это не поможет сделать минимальный работоспособный пример, с которым мы можем поиграть, чтобы заставить его работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...