创建对象时我做了
glGenBuffers(1, &m_buf); checkError();
glBindBuffer(GL_ARRAY_BUFFER, m_buf); checkError();
glBufferData(GL_ARRAY_BUFFER, vertices_length, vertices, GL_DYNAMIC_DRAW); checkError();
创建并初始化缓冲区。我使用GL_DYNAMIC_DRAW
因为几何体将被修改。
当我需要修改对象的几何时,我用新数据调用glBufferData
。我知道这不是最有效的方式,但我现在并不关心效率。
当我不再需要所说的对象时,
glBindBuffer(GL_ARRAY_BUFFER, 0); checkError();
glDeleteBuffers(1, &m_buf); checkError();
删除已分配的缓冲区。
在glDeleteBuffers
个GL_DYNAMIC_DRAW
数据缓冲区后,对glDrawArrays
的不同对象的任何调用都会生成GL_INVALID_OPERATION
。当删除的缓冲区具有GL_STATIC_DRAW
数据时,没有问题。错误后屏幕显示为黑色。
我在glGetError()
的每次OpenGL调用后调用checkError()
。报告的第一个错误是glDrawArrays
之后的另一个对象。
11-20 18:46:42.199: E/Adreno200-ES20(3023): <gl_draw_error_checks:418>: GL_INVALID_OPERATION
11-20 18:46:42.209: D/graphics(3023): glError: 1282
使用OpenGL ES 2.0。测试HTC One J(HTC J ISW13HT),Android 4.0.4版。
使用GL_DYNAMIC_DRAW数据处理缓冲区的正确方法是什么?
答案 0 :(得分:0)
可能仍有一个缓冲区绑定到其中一个属性。
浏览绑定的属性并为其调用glDisableVertexAttribArray
(或将另一个缓冲区绑定到它)。