混合VBO和非VBO渲染的Opengles提供EXC_BAD_ACCESS
Opengles mixing VBO and non VBO renders gives 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_ARAY);glDrawElements(GL_TRIANGLES,vbo->indexCount,GL_UNSIGNED_SHORT,bodyOffset);glDisableClientState(GL_COLOR_ARAY);glDisableClientState(GL_VERTEX_ARRAY);}渲染B(){静态GLfloat顶点[]={1.0,1.0,1.0,2.0,1.0,10};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绘图调用(RenderA)的末尾添加以下代码行:
glBindBuffer(GL_ElEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
相关文章:
- OpenGL VBO Indexing ( How to compute Index Array)
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 将单个未唱的 int 发送到 VBO
- VBO必须在VAO之后绑定
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- OpenGL:第二个VBO破坏了第一个VBO
- 如何告诉 VBO 处理给定的数据?(布料模拟)
- 我们是否需要序列化 VAO 和 VBO
- OpenGL VAO VBO resize
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 将 OpenGL VBO 与自定义类/数据结构一起使用
- Qtopengl,为什么不能用不同的vbo画两个立方体
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 为什么VAO可以使用VBO数据绑定它?
- 可以在同一 VBO 中存储不同的顶点属性和索引
- 两个不同的对象 OpenGL.VAO VBO IBO 网格失真问题
- c++ cuda opengl not rendering vbo
- 在 OpenGL 中,在保持良好帧速率的同时,VBO 中有多少个顶点的好目标是什么
- OpenGL 在与呈现线程不同的线程中创建和加载 VBO 信息
- 仅更新所选三角形的颜色,VBO 更新