混合VBO和非VBO渲染的Opengles给出了EXC_BAD_ACCESS

时间:2011-05-27 14:31:18

标签: c++ opengl rendering vbo

嘿伙计们。我试图渲染下面显示的两种方法。 RenderA()使用VBO而RenderB()不是。我在RenderB()中到达glDrawArrays()时得到一个EXC_BAD_ACCESS错误。

RenderB()工作正常,但如果我不创建和使用任何VBO,即当我注释掉CreateVBOs()和RenderA()时。

  1. 这是否意味着一旦开始使用VBO,所有渲染都必须使用VBO?
  2. 或者我在这里做错了什么?
  3. 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);
    }
    

    编辑(解决)

    想出来。显然你必须确保解除缓冲区的绑定,如果它之前是绑定的,以便在没有vbo的情况下进行渲染。

    我的CreateVBOs()函数绑定但没有取消绑定缓冲区,以便在RenderB()尝试使用glDrawArrays时创建错误访问。取消绑定缓冲区只是将它绑定到0,如下所示:

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

1 个答案:

答案 0 :(得分:9)

在进行非VBO绘制调用之前,尝试将GL_ELEMENT_ARRAY_BUFFER和GL_ARRAY_BUFFER绑定为零。

将以下代码行添加到VBO绘制调用(RenderA)的末尾:

glBindBuffer(GL_ElEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);