当我在OpenGL 2.0中更新iOS上的顶点数组时,原始顶点数据仍然停留在屏幕上--即第一次刷新是持久的(我向GPU发送的最初的点集每帧都会被渲染),但第二次、第三次、第四次...n次刷新似乎都会覆盖同一块内存。
所以我正在做:
vector<VertexType> rawDynamicData ;
glGenVertexArraysOES( 1, &va ) ; CHECK_GL ;
glBindVertexArrayOES( va ) ; CHECK_GL ;
glGenBuffers( 1, &vb ) ; CHECK_GL ;
glBindBuffer( GL_ARRAY_BUFFER, vb ) ; CHECK_GL ;
glBufferData( glBufferData(
GL_ARRAY_BUFFER, //Specifies the target buffer object.
rawDynamicData.size() * sizeof( VertexType ),
&rawDynamicData[0],
GL_DYNAMIC_DRAW // I plan to update the data every frame
) ; CHECK_GL ;
在后续的帧中,我只是再次调用:// update the data
glBufferData( glBufferData(
GL_ARRAY_BUFFER, //Specifies the target buffer object.
rawDynamicData.size() * sizeof( VertexType ),
&rawDynamicData[0],
GL_DYNAMIC_DRAW // I plan to update the data every frame
) ; CHECK_GL ;
我也尝试过
//update the data
GLvoid* vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
memcpy(vbo_buffer, &rawDynamicData[0], rawDynamicData.size()*sizeof(VertexType) );
glUnmapBufferOES(GL_ARRAY_BUFFER);
然而,不论采用哪种方式,我都得到了这个结果:
白点是初始数据,红点是随后调用glBufferData
的结果。
因此,关于OpenGL ES 2.0中动态VBOs,这个问题有几个方面:
创建一个元素将在每一帧完全更新的动态顶点缓冲区的正确命令顺序是什么?
顶点缓冲区是否可以在帧之间增长?还是必须精确地刷新相同的大小?
我知道使用“客户端内存”指针,你能在OpenGL ES 2.0中这样做(避免memcpy),还是这已经过时了,应该只使用顶点缓冲区?