2016-06-20 11 views
0

私はいくつかのWebGLコードを扱っています。その一部は、頂点属性を保持するためにWebGlBufferのインスタンスを扱っています。WebGlBufferのサイズを変更するには?

私にはわからない(先験的)バッファが保持する必要がありますデータの量なので、より多くの三角形がシーンに追加されているようWebGlBufferが成長するだろう、何かのように:

/// Init the WebGlBuffer 
var buff = gl.createBuffer(); 

gl.bindBuffer(gl.ARRAY_BUFFER, buff); 
gl.bufferData(gl.ARRAY_BUFFER, 1024, this._gl.DYNAMIC_DRAW); 

/// Push data for some triangles 
gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(dataForVertex0)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 128, new Float32Array(dataForVertex1)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 256, new Float32Array(dataForVertex2)); 


/// A few seconds later, room for more triangles is needed 

gl.bindBuffer(gl.ARRAY_BUFFER, buff); 
gl.bufferData(gl.ARRAY_BUFFER, 2048, this._gl.DYNAMIC_DRAW); 

/// ... so I can keep adding data for more triangles 
gl.bufferSubData(gl.ARRAY_BUFFER, 1024, new Float32Array(dataForVertex0)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 1152, new Float32Array(dataForVertex1)); 
gl.bufferSubData(gl.ARRAY_BUFFER, 1280, new Float32Array(dataForVertex2)); 

マイ問題は、gl.bufferData()へのすべての呼び出しがWebGlBufferの現在の内容をゼロで上書きすることです。 bufferSubDataはバッファのサイズを自動的に変更せず、代わりにバッファオーバーフローの警告をトリガします。

私が知る限り、WebGlBufferの内容を操作する唯一の方法はbufferDatabufferSubDataです。

パフォーマンス上の理由から、ArrayBufferにデータのコピーを保存することは避けたいと思います(バッファには軽度のメモリが使用されるため)。

(効率的に)WebGlBufferのインスタンスのサイズを変更するために、またはWebGlBuffer大きなへWebGlBuffer小さいの内容をコピーする方法はありますか? WebGL APIの機能が不足しているか、重複したデータを保持する必要がありますか?

+0

メイクバッファを最初から大きくするのはどうですか?それは助けることができますか? –

+0

私が言ったように:«私は(先験的に)バッファが保持しなければならないデータの量を知らない。 3KiB、500MiBかもしれない。 – IvanSanchez

答えて

1

残念ながら、WebGLにはこのような能力が欠けています。バッファーのサイズを変更したい場合は、バッファーの内容が失われます。バッファーを回避する方法はありません。あなたができることは、すべての将来の使用のために十分なスペースを事前に割り当てることです。私のプロジェクトでは、これを行い、可能な "メモリ不足"状況のためにバッファ内容のコピーを保持します(バッチバッファの更新にも役立ちます)。しかし、私のジオメトリデータは比較的小さいです。

また、WebGL2にはcopyBufferSubDataがあります。

+0

その後、私は 'ArrayBuffer'でコピーを保持するために戻ってきます。私の疑惑を確認していただきありがとうございます。 – IvanSanchez

関連する問題