3

フレームバッファのピクセルを float 値として読み取る必要があります。私の目標は、CPU と GPU の間で大量のパーティクルを高速に転送し、リアルタイムで処理することです。そのために、パーティクル プロパティを浮動小数点テクスチャに保存します。

新しいパーティクルが追加されるたびに、現在のパーティクル配列をテクスチャから取得し、新しいパーティクル プロパティを追加してからテクスチャに戻します (これは、パーティクルを動的に追加して処理するために考えられる唯一の方法です) GPU に関して)。

PIXEL_PACK_BUFFERターゲットへのピクセルの読み戻しをサポートしているため、WebGL 2 を使用しています。コードを Firefox Nightly でテストします。問題のコードは次のようになります。

// Initialize the WebGLBuffer
this.m_particlePosBuffer = gl.createBuffer();
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, this.m_particlePosBuffer);
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
...
// In the renderloop, bind the buffer and read back the pixels
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, this.m_particlePosBuffer);
gl.readBuffer(gl.COLOR_ATTACHMENT0); // Framebuffer texture is bound to this attachment
gl.readPixels(0, 0, _texSize, _texSize, gl.RGBA, gl.FLOAT, 0);

コンソールに次のエラーが表示されます。

TypeError: Argument 7 of WebGLRenderingContext.readPixels could not be converted to any of: ArrayBufferView, SharedArrayBufferView.

しかし、現在の WebGL 2 仕様を見ると、この関数呼び出しは可能なはずです。タイプを使用すると、gl.UNSIGNED_BYTEこのエラーも返されます。ArrayBufferView でピクセルを読み込もうとすると (かなり遅いように見えるので避けたい)、 and for a のフォーマット/タイプの組み合わせで機能しますが、and gl.RGBAfor gl.UNSIGNED_BYTEaでは機能Uint8Array()しません- これは文書化されているため、期待どおりです。 WebGL 仕様で。gl.RGBAgl.FLOATFloat32Array()

フレームバッファからフロートピクセル値を取得する方法、またはこのパーティクルパイプラインを実行する方法についての提案に感謝します。

4

3 に答える 3