私はいくつかの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
の内容を操作する唯一の方法はbufferData
とbufferSubData
です。
パフォーマンス上の理由から、ArrayBuffer
にデータのコピーを保存することは避けたいと思います(バッファには軽度のメモリが使用されるため)。
(効率的に)WebGlBuffer
のインスタンスのサイズを変更するために、またはWebGlBuffer
大きなへWebGlBuffer
小さいの内容をコピーする方法はありますか? WebGL APIの機能が不足しているか、重複したデータを保持する必要がありますか?
メイクバッファを最初から大きくするのはどうですか?それは助けることができますか? –
私が言ったように:«私は(先験的に)バッファが保持しなければならないデータの量を知らない。 3KiB、500MiBかもしれない。 – IvanSanchez