在OpenGL ES 2中更新VBO的顶点

时间:2018-02-08 00:01:22

标签: 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);

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

还是有更好,更有效的方式吗?我相信每次想要更改顶点时调用上面的代码都不会太优。感谢任何回答,谢谢。

1 个答案:

答案 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绘图命令的来源。

  •