1

大家好。我试图呈现如下所示的两种方法。RenderA() 正在使用 VBO,而 RenderB() 不是。当它到达 RenderB() 中的 glDrawArrays() 时,我得到一个 EXC_BAD_ACCESS 错误。

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

  1. 那么这是否意味着一旦你开始使用 VBO,所有的渲染都必须使用 VBO?
  2. 或者我在这里做错了什么?
使成为() {
    创建VBOs(); //glGenBuffers,glBindBuffer,glBufferData 等        
    渲染A();       
    渲染B();
    }

渲染A(){           
    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);
}

渲染B(){
    静态 GLfloat 顶点[] = {1.0,1.0,1.0,2.0,1.0,1.0};

    glEnableClientState(GL_VERTEX_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, 顶点);

    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);
4

1 回答 1

9

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

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

glBindBuffer(GL_ElEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
于 2011-05-27T14:52:06.207 回答