当我在 OpenGL 2.0 中更新 iOS 上的顶点数组时,原始顶点数据保留在屏幕上——即第一次刷新是持久的(我发送到 GPU 的初始点集每帧都被渲染),但第二次刷新,第 3 次,第 4 次,.. 第 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 中的动态 vbo:
创建动态顶点缓冲区的正确命令顺序是什么,其元素将在每一帧上完全更新?
顶点缓冲区可以在帧之间增长吗? 还是我必须冲洗完全相同的尺寸?
我知道使用“客户端内存”指针,您可以在 OpenGL ES 2.0 中执行此操作(以避免 memcpy)还是不推荐使用,应该专门使用顶点缓冲区?