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

Posted

技术标签:

【中文标题】Opengles 混合 VBO 和非 VBO 渲染给出 EXC_BAD_ACCESS【英文标题】:Opengles mixing VBO and non VBO renders gives EXC_BAD_ACCESS 【发布时间】:2011-09-03 11:11:38 【问题描述】:

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

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

    那么这是否意味着一旦开始使用 VBO,所有渲染都必须使用 VBO? 或者我在这里做错了什么?
使成为() 创建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);

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于Opengles 混合 VBO 和非 VBO 渲染给出 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL ES 2 中实现 VBO 以渲染精灵

在 Android 中使用带有 OpenGL ES 的 VBO 性能不佳

OpenGL ES 2.0 vbo 白屏

在 iOS 上使用具有多个 VBO 和 IBO(多个对象)OpenGLES 2 的 VAO 进行绘制

OpenGL ES 1.1:无法转换为 VBO

生成 GL VBO 数据的最佳实践