Opengl es 在OpenGL ES 2中更新VBO的顶点

Opengl es 在OpenGL ES 2中更新VBO的顶点,opengl-es,opengl-es-2.0,vbo,Opengl Es,Opengl Es 2.0,Vbo,如果要更改VBO的顶点,是否必须使用新的顶点数组重复下面代码中所示的过程 GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo); GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuffer.capacity() * BYTES_PER_FLOAT, vertexBuffer, GLES20.GL_STATIC_DRAW

如果要更改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);

还是有更好、更有效的方法?我相信每次我想更改顶点时调用上面的代码不会太理想。非常感谢您的回答。

如果您想更改现有缓冲区对象的数据,则应使用。为缓冲区对象创建新数据存储时,更新缓冲区对象的数据存储。这避免了重新分配数据存储的成本

见:

BufferData
删除任何现有数据存储,并设置缓冲区的值 对象的状态变量,如表所示

要修改缓冲区对象的数据存储中包含的部分或全部数据,客户机可以使用以下命令

void BufferSubData( enum target, intptr offset, sizeiptr size, const void *data );

此外,您还应根据需要设置
glBufferData
usage
参数

见:

用法
指定为三个枚举值之一,指示数据存储的预期应用程序用法模式。这些数值是:

  • STATIC\u DRAW
    数据存储内容将由应用程序指定一次, 并多次用作GL绘图命令的源

  • DYNAMIC\u DRAW
    应用程序将重复指定数据存储内容,并多次将其用作GL绘图命令的源

  • STREAM\u DRAW
    数据存储内容将由应用程序指定一次,最多用作GL绘图命令的源几次


... 但是要注意更新仍在使用的东西,否则即使使用
glBufferSubData
,大多数驱动程序也会产生完整的拷贝成本。参见@Rabbid76再次感谢您提供的有用答案。如果顶点将频繁更改,您认为创建VBO值得吗?有没有比使用VBO更好的方法?@LAD常见的现代方法是使用VBO。但您必须关注的最后一个参数可以是
GL\u STREAM\u DRAW
GL\u STATIC\u DRAW
,或
GL\u DYNAMIC\u DRAW
void BufferData( enum target, sizeiptr size, const void *data, enum usage );