2013-05-09 8 views
8

は、私が見つかりました:bufferData - クロノスの仕様を読んでいる間、使用パラメータの違い

bufferData(ulong target, Object data, ulong usage) 

'用法' パラメータを指定できますSTREAM_DRAW、STATIC_DRAWまたはDYNAMIC_DRAW

私の質問は、一つは私が使用すべき、ありますか? 利点は何ですか?違いは何ですか? なぜSTATIC_DRAWの代わりに他のものを使用するのですか?

ありがとうございました。 'デスクトップ' のOpenGLのために

答えて

16

は、ここで良い説明があります:

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

基本的には、使用量パラメータあなたは、バッファを使用する方法についてのOpenGL/WebGLのへのヒントです。 OpenGL/WebGLはヒントに応じてバッファを最適化することができます。

OpenGL ES docsは(WebGLのは、OpenGLのESから継承されていることを覚えておいてください)OpenGLのと全く同じではありませんこれは、次のように書いている:

STREAM

  • データストアの内容がします一度だけ変更して、最大で数回使用する。

STATIC

  • データ・ストアの内容を一旦変更して何回も使用されます。

DYNAMIC

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

アクセスの性質がなければならない:

  • をDRAWデータストアの内容がアプリケーションによって修正され、GL描画と画像特定コマンドのソースとして使用されます。

最も一般的な使用方法は、(静的幾何学的形状のために)STATIC_DRAWであるが、私は最近DYNAMIC_DRAWは、(粒子がバッファの部分が更新された単一のバッファに格納され、より理にかなって小粒子システムを作成しました粒子が放出される)。

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

コードスニペット: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; 
} 
+0

場合は?更新せずに、ステップは、バッファを作成し、それをバインドし、bufferDataをシェーダプログラムに送ります。どこで更新が行われますか? –

+3

gl.bufferDataを使用してバッファを作成し、初期値で埋めると、gl.bufferSubData関数を使用して別のフレームのバッファ(またはその一部)を更新できます。フィドルのソースコードを見てみてください。何が起きているのかを見るのはかなり簡単です。 – Mortennobel

+1

この答えを見ている人は、ドキュメンテーションへのリンクを見れば、頻繁に変更して使用すると実際にストリームが描かれることがわかります。一度しか変更しないでください。 – Ellie

関連する問題