Khronos で仕様を読んでいるときに、次のことがわかりました。
bufferData(ulong target, Object data, ulong usage)
'usage' パラメーターは、STREAM_DRAW、STATIC_DRAW、または DYNAMIC_DRAW のいずれかです。
私の質問は、どちらを使用すればよいですか? 利点は何ですか、違いは何ですか?STATIC_DRAW の代わりに他のものを使用することを選択するのはなぜですか?
ありがとう。
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ドキュメントには次のように書かれていますが、これは OpenGL とまったく同じではありません (WebGL は OpenGL ESから継承されていることに注意してください)。
ストリーム
静的
動的
アクセスの性質は次のとおりでなければなりません。
描く
最も一般的な使用法は 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;
}