Opengles mixing VBO and non VBO renders gives EXC

Hey guys. Im trying to render two methods shown below. RenderA() is using VBOs and RenderB() isnt. Im getting an EXC_BAD_ACCESS error when it reaches glDrawArrays() in RenderB().

RenderB() works fine though if i dont create and use any VBOs, ie when i comment out CreateVBOs() and RenderA().

  • So does this mean once you start using VBOs, all renderings must use VBOs?
  • Or what am I doing wrong here?
  • Render() { 
        CreateVBOs(); //glGenBuffers,glBindBuffer,glBufferData etc        
        RenderA();       
        RenderB();
        }
    
    RenderA(){           
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo->indexBuffer);
        glBindBuffer(GL_ARRAY_BUFFER, vbo->vertexBuffer);
    
        glVertexPointer(3, GL_FLOAT, sizeof(Vertex), 0);
        glColorPointer(4, GL_FLOAT, sizeof(Vertex), colorOffset);   
    
        glEnableClientState(GL_VERTEX_ARRAY);   
        glEnableClientState(GL_COLOR_ARRAY);
    
        glDrawElements(GL_TRIANGLES,vbo->indexCount, GL_UNSIGNED_SHORT, bodyOffset);
    
        glDisableClientState(GL_COLOR_ARRAY);   
        glDisableClientState(GL_VERTEX_ARRAY);
    }
    
    RenderB(){
        static GLfloat vertices[] = {1.0,1.0,1.0,2.0,1.0,1.0};
    
        glEnableClientState(GL_VERTEX_ARRAY);
    
        glVertexPointer(3, GL_FLOAT, 0, vertices);
    
        glDrawArrays(GL_POINTS, 0, 2);
    
        glDisableClientState(GL_VERTEX_ARRAY);
    }
    

    Edit(Solved)

    Figured it out. Apparently you have to make sure you unbind the buffer if it was binded before in order to render without vbo.

    My CreateVBOs() function binded but did not unbind the buffer so thats what created bad access when RenderB() was trying to use glDrawArrays. Unbinding the buffer is just binding it to 0 like so:

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    

    Try binding GL_ELEMENT_ARRAY_BUFFER and GL_ARRAY_BUFFER to zero before doing your non-VBO draw calls.

    Add the following lines of code to the end of your VBO draw calls (RenderA):

    glBindBuffer(GL_ElEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    
    链接地址: http://www.djcxy.com/p/38484.html

    上一篇: 两个NSOpenGLContexts之间共享什么?

    下一篇: 混合VBO和非VBO渲染的Opengles可以提供EXC