bufferData - 使用参数差异

时间:2013-05-09 13:04:12

标签: webgl

在阅读Khronos的规范时,我发现:

bufferData(ulong target, Object data, ulong usage) 

'usage'参数可以是:STREAM_DRAW,STATIC_DRAW或DYNAMIC_DRAW

我的问题是,我应该使用哪一个? 有什么优点,有什么区别? 为什么我会选择使用其他一些而不是STATIC_DRAW?

感谢。

1 个答案:

答案 0 :(得分:18)

对于'桌面'OpenGL,这里有一个很好的解释:

http://www.opengl.org/wiki/Buffer_Object

基本上,使用参数 是OpenGL / WebGL的提示 ,了解您打算如何使用缓冲区。然后,OpenGL / WebGL可以根据您的提示优化缓冲区。

OpenGL ES docs写下以下内容,与OpenGL不完全相同(请记住,WebGL继承自OpenGL ES ):

STREAM

  • 数据存储内容将被修改一次,最多使用几次。

STATIC

  • 数据存储内容将被修改一次并多次使用。

DYNAMIC

  • 数据存储内容将被重复修改并多次使用。

访问的性质必须是:

DRAW

  • 数据存储内容由应用程序修改,并用作GL绘图和图像规范命令的源。

最常见的用法是STATIC_DRAW(对于静态几何体),但我最近创建了一个小粒子系统,其中DYNAMIC_DRAW更有意义(粒子存储在单个缓冲区中,其中部分缓冲区在粒子发射时更新)。

http://jsfiddle.net/mortennobel/YHMQZ/

代码段:

function createVertexBufferObject(){
    particleBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, particleBuffer);
    var vertices = new Float32Array(vertexBufferSize * particleSize);
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.DYNAMIC_DRAW);
    bindAttributes();
}

function emitParticle(x,y,velocityX, velocityY){
    gl.bindBuffer(gl.ARRAY_BUFFER, particleBuffer);
    // ...
    gl.bufferSubData(gl.ARRAY_BUFFER, particleId*particleSize*sizeOfFloat, data);
    particleId = (particleId +1 )%vertexBufferSize;
}