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
后,问题得到解决。如果你把它作为答案发布,我会接受:)