c++ - 混合 VBO 和非 VBO 渲染的 Opengles 给出 EXC_BAD_ACCESS

标签 c++ opengl rendering vbo

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

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

  1. 那么这是否意味着一旦您开始使用 VBO,所有渲染都必须使用 VBO?
  2. 或者我在这里做错了什么?
Render() { 
    CreateVBOs(); //glGenBuffers,glBindBuffer,glBufferData etc        
    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(){
    static GLfloat vertices[] = {1.0,1.0,1.0,2.0,1.0,1.0};

    glEnableClientState(GL_VERTEX_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, vertices);

    glDrawArrays(GL_POINTS, 0, 2);

    glDisableClientState(GL_VERTEX_ARRAY);
}

Edit(Solved)

Figured it out. Apparently you have to make sure you unbind the buffer if it was binded before in order to render without vbo.

My CreateVBOs() function binded but did not unbind the buffer so thats what created bad access when RenderB() was trying to use glDrawArrays. Unbinding the buffer is just binding it to 0 like so:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

最佳答案

在执行非 VBO 绘制调用之前尝试将 GL_ELEMENT_ARRAY_BUFFER 和 GL_ARRAY_BUFFER 绑定(bind)为零。

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

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

关于c++ - 混合 VBO 和非 VBO 渲染的 Opengles 给出 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153704/

相关文章:

c++ - 显示函数的完全限定名称

c# - OpenGL 绘制每 n 个顶点

opengl - glDrawPixels 的像素位置错误

css - 使用 CSS3 "background-size"是否可以加快页面渲染?

java - Swing 渲染在 JDK 1.8 中出现问题,在 JDK 1.7 中正确

c++ - 如何保护类(class)成员?

c++ - 将一组内存从 void* 转换为一个类

java - 如何将多个参数传递到 Play 2.0 中的模板中?

c++ - 使用指针在 C++ 中传递标量和数组数据

c++ - 着色器中的多个 [in] 属性 - OpenGL