混合VBO和非VBO渲染的Opengles提供EXC_BAD_ACCESS

Opengles mixing VBO and non VBO renders gives EXC_BAD_ACCESS

本文关键字:VBO EXC ACCESS 提供 BAD 和非 混合 Opengles      更新时间:2023-10-16

嘿,伙计们。我正在尝试呈现下面显示的两种方法。RenderA()正在使用VBO,而RenderB()没有。当它到达RenderB()中的glDrawArrays()时,我得到一个EXC_BAD_ACCESS错误。

如果我不创建和使用任何VBO,即当我注释掉CreateVBOs()和RenderA()时,RenderB()可以很好地工作。

  1. 那么,这是否意味着一旦开始使用VBO,所有渲染都必须使用VBO
  2. 或者我在这里做错了什么
Render(){CreateVBOs()//glGenBuffers、glBindBuffer、glBufferData等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_ARAY);glDrawElements(GL_TRIANGLES,vbo->indexCount,GL_UNSIGNED_SHORT,bodyOffset);glDisableClientState(GL_COLOR_ARAY);glDisableClientState(GL_VERTEX_ARRAY);}渲染B(){静态GLfloat顶点[]={1.0,1.0,1.0,2.0,1.0,10};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);
在执行非VBO绘制调用之前,请尝试将GL_ELEMENT_ARRAY_BUFFER和GL_ARRAY.BUFFER绑定为零。

在VBO绘图调用(RenderA)的末尾添加以下代码行:

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