Android 使用GL\U动态\U绘图数据处理缓冲区的正确方法

Android 使用GL\U动态\U绘图数据处理缓冲区的正确方法,android,opengl-es,android-ndk,opengl-es-2.0,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(); glBindBuffer(GL_ARRAY_BUFFER, 0); checkError(); glDelet

当我创建一个对象时

glGenBuffers(1, &m_buf); checkError();
glBindBuffer(GL_ARRAY_BUFFER, m_buf); checkError();
glBufferData(GL_ARRAY_BUFFER, vertices_length, vertices, GL_DYNAMIC_DRAW); checkError();
glBindBuffer(GL_ARRAY_BUFFER, 0); checkError();
glDeleteBuffers(1, &m_buf); checkError();
创建并初始化缓冲区。我使用
GL\u DYNAMIC\u DRAW
,因为几何图形将被修改

当我需要修改对象的几何体时,我使用新数据调用
glBufferData
。我知道这不是最有效的方法,但我现在不关心效率

当我不再需要所说的对象时,我会这样做

glGenBuffers(1, &m_buf); checkError();
glBindBuffer(GL_ARRAY_BUFFER, m_buf); checkError();
glBufferData(GL_ARRAY_BUFFER, vertices_length, vertices, GL_DYNAMIC_DRAW); checkError();
glBindBuffer(GL_ARRAY_BUFFER, 0); checkError();
glDeleteBuffers(1, &m_buf); checkError();
删除已分配的缓冲区

在使用
GL\u DYNAMIC\u DRAW
数据对缓冲区进行
glDeleteBuffers
后,对不同对象调用
glDrawArrays
将生成
GL\u INVALID\u操作。当删除的缓冲区具有
GL\u STATIC\u DRAW
数据时,没有问题。错误发生后,屏幕显示为完全黑色

每次在
checkError()
中调用OpenGL后,我都会调用
glGetError()
。报告的第一个错误位于不同对象的
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
11-20 18:46:42.199:E/Adreno200-ES20(3023)::GL\u无效\u操作
11-20 18:46:42.209:D/图形(3023):格雷罗:1282
使用OpenGLES2.0。在HTC One J(HTC J ISW13HT)上测试,Android版本4.0.4


使用GL_DYNAMIC_DRAW data处理缓冲区的正确方法是什么?

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


检查它绑定到的属性,并为其调用
glDisableVertexAttributeArray
(或将另一个缓冲区绑定到它)。

可能还有一个缓冲区绑定到其中一个属性。你说得对!添加相应属性的
glDisableVertexAttributeArray
后,问题得到解决。如果你把它作为答案发布,我会接受:)