大家好。我试图呈现如下所示的两种方法。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);