如何解决Opengles将VBO和非VBO渲染混合在一起得到EXC_BAD_ACCESS
| 大家好。我试图渲染如下所示的两种方法。 RenderA()正在使用VBO,而RenderB()不是。我到达RenderB()中的glDrawArrays()时收到EXC_BAD_ACCESS错误。 尽管如果我不创建和使用任何VBO,即当我注释掉CreateVBOs()和RenderA()时,RenderB()也可以正常工作。 那么这是否意味着一旦开始使用VBO,所有渲染都必须使用VBO? 还是我在这里做错了什么? 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_ARRAY); glDrawElements(GL_TRIANGLES,vbo-> indexCount,GL_UNSIGNED_SHORT,bodyOffset); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); } RenderB(){ 静态GLfloat顶点[] = {1.0,1.0,2.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);
解决方法
在进行非VBO绘制调用之前,请尝试将GL_ELEMENT_ARRAY_BUFFER和GL_ARRAY_BUFFER绑定为零。
将以下代码行添加到VBO绘制调用(RenderA)的末尾:
glBindBuffer(GL_ElEMENT_ARRAY_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER,0);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。