首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bufferData - usage参数差异

bufferData - usage参数差异
EN

Stack Overflow用户
提问于 2013-05-09 21:04:12
回答 1查看 13.8K关注 0票数 11

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

代码语言:javascript
复制
bufferData(ulong target, Object data, ulong usage) 

“‘usage”参数可以是: STREAM_DRAW、STATIC_DRAW或DYNAMIC_DRAW

我的问题是,我应该使用哪一个?它们的优势是什么,区别是什么?为什么我要选择使用其他的STATIC_DRAW?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-09 23:21:51

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

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

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

OpenGL docs编写以下代码,这与用于OpenGL的代码不完全相同(请记住,WebGL是从OpenGL ES继承的):

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

静态

  • 数据存储内容只需修改一次即可多次使用。

动态

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

访问的性质必须是:

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

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

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

代码片段:

代码语言:javascript
复制
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;
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16462517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档