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); } 编辑(已解决) 弄清楚了。显然,如果没有绑定缓冲区,则必须确保取消绑定缓冲区,以便在不使用vb​​o的情况下进行渲染。 我的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);
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...