11

Khronos で仕様を読んでいるときに、次のことがわかりました。

bufferData(ulong target, Object data, ulong usage) 

'usage' パラメーターは、STREAM_DRAW、STATIC_DRAW、または DYNAMIC_DRAW のいずれかです。

私の質問は、どちらを使用すればよいですか? 利点は何ですか、違いは何ですか?STATIC_DRAW の代わりに他のものを使用することを選択するのはなぜですか?

ありがとう。

4

1 に答える 1

19

「デスクトップ」OpenGL については、ここに適切な説明があります。

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

基本的に、使用パラメータは、バッファをどのように使用するかについての OpenGL/WebGL へのヒントです。OpenGL/WebGL は、ヒントに応じてバッファを最適化できます。

OpenGL ESドキュメントには次のように書かれていますが、これは OpenGL とまったく同じではありません (WebGL は OpenGL ESから継承されていることに注意してください)。

ストリーム

  • データ ストアの内容は 1 回変更され、多くても数回使用されます。

静的

  • データ ストアの内容は一度変更され、何度も使用されます。

動的

  • データ ストアの内容は、繰り返し変更され、何度も使用されます。

アクセスの性質は次のとおりでなければなりません。

描く

  • データ ストアの内容はアプリケーションによって変更され、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;
}
于 2013-05-09T15:21:50.503 に答える