gpt4 book ai didi

webgl - bufferData - 使用参数差异

转载 作者:行者123 更新时间:2023-12-04 03:08:18 24 4
gpt4 key购买 nike

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

bufferData(ulong target, Object data, ulong usage) 

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

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

谢谢。

最佳答案

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

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

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

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

溪流

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

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

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

  • 访问的性质必须是:


  • 数据存储内容由应用程序修改,并用作 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;
    }

    关于webgl - bufferData - 使用参数差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16462517/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com