如果我想更改VBO的顶点,我是否必须重复下面代码中显示的过程,但是有一个新的顶点数组?
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER,
vertexBuffer.capacity() * BYTES_PER_FLOAT,
vertexBuffer, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
还是有更好,更有效的方式吗?我相信每次想要更改顶点时调用上面的代码都不会太优。感谢任何回答,谢谢。
答案 0 :(得分:2)
如果要更改现有缓冲区对象的数据,则应使用glBufferSubData
。当glBufferData
为缓冲区对象创建新的数据存储时,glBufferSubData
更新缓冲区对象的数据存储。这样可以避免重新分配数据存储的成本。
请参阅OpenGL ES 2.0 Full Specification, 2.9. BUFFER OBJECTS, page 24:
所示
BufferData
删除任何现有数据存储,并设置缓冲区的值 对象的状态变量如表........
要修改缓冲区对象的数据存储中包含的部分或全部数据,客户端可以使用命令
void BufferSubData( enum target, intptr offset, sizeiptr size, const void *data );
此外,您应根据需要设置usage
glBufferData
参数。
请参阅OpenGL ES 2.0 Full Specification, 2.9. BUFFER OBJECTS, page 23:
void BufferData( enum target, sizeiptr size, const void *data, enum usage );
...
usage
被指定为三个枚举值之一,表示数据存储的预期应用程序使用模式。值为:
STATIC_DRAW
数据存储内容将由应用程序指定一次, 并多次用作GL绘图命令的来源。
DYNAMIC_DRAW
数据存储内容将由应用程序重复指定,并多次用作GL绘图命令的来源。
STREAM_DRAW
数据存储内容将由应用程序指定一次,并且最多使用几次作为GL绘图命令的来源。