使用GL_DYNAMIC_DRAW数据处理缓冲区的正确方法

时间:2014-11-20 12:30:04

标签: android opengl-es android-ndk opengl-es-2.0

创建对象时我做了

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();

删除已分配的缓冲区。

glDeleteBuffersGL_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数据处理缓冲区的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

可能仍有一个缓冲区绑定到其中一个属性。

浏览绑定的属性并为其调用glDisableVertexAttribArray(或将另一个缓冲区绑定到它)。