Webgl bufferData-使用参数差异

Webgl bufferData-使用参数差异,webgl,Webgl,在阅读Khronos的规范时,我发现: bufferData(ulong target, Object data, ulong usage) “用法”参数可以是:流绘制、静态绘制或动态绘制 我的问题是,我应该使用哪一个? 优势是什么,区别是什么? 为什么我会选择使用其他方式来代替静态画图 谢谢。对于“桌面”OpenGL,这里有一个很好的解释: 基本上,usage参数是对OpenGL/WebGL如何使用缓冲区的提示。然后,OpenGL/WebGL可以根据提示优化缓冲区 写入以下内容,这与Op

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

bufferData(ulong target, Object data, ulong usage) 
“用法”参数可以是:流绘制、静态绘制或动态绘制

我的问题是,我应该使用哪一个? 优势是什么,区别是什么? 为什么我会选择使用其他方式来代替静态画图


谢谢。

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

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

写入以下内容,这与OpenGL不完全相同(请记住,WebGL是从OpenGLES继承的):

溪流

  • 数据存储内容将修改一次,最多使用几次
静止的

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

  • 数据存储内容将被反复修改和多次使用
访问的性质必须是:

  • 数据存储内容由应用程序修改,并用作GL图形和图像规范命令的源
最常见的用法是STATIC_DRAW(对于静态几何体),但我最近创建了一个小粒子系统,其中DYNAMIC_DRAW更有意义(粒子存储在单个缓冲区中,当粒子发射时,缓冲区的一部分会更新)

代码段:

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;
}

如果将某个内容设置为DYNAMIC_DRAW,我将如何“更新”缓冲区?在不更新的情况下,步骤是:创建缓冲区、绑定缓冲区、缓冲数据、将其发送到着色器程序。在何处进行更新?在使用gl.bufferData创建缓冲区并用初始值填充后,可以使用gl.bufferSubData函数在另一帧中更新缓冲区(或其部分)。试着看一看fiddle的源代码——应该很容易看到发生了什么。只要向任何看到这个答案的人提醒一下,如果你看一下文档的链接,你就会发现流绘制实际上是你经常修改和使用的。并不是说您只修改了一次。@Ellie注意,第一个链接是指向OpenGL解释的,而不是指向OpenGL ES(WebGL)。他们似乎differ@CiprianTomoiaga我实际上指的是第二个链接,但正如你所说,gl和GLE似乎各处都有一些不同。