【发布时间】:2012-09-22 01:06:20
【问题描述】:
当我在 OpenGL 2.0 中更新 iOS 上的顶点数组时,原始顶点数据保留在屏幕上 - 即第一次刷新是持久的(我发送到 GPU 的初始点集每帧都会渲染),但是第 2 次、第 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)还是已弃用,应仅使用顶点缓冲区?
【问题讨论】:
-
赏金疯狂!
标签: ios opengl-es-2.0 vertex-buffer