2016-10-23 1 views
0

私は頂点シェーダからいくつかの頂点データを回復しようとしていましたが、これに関するインターネット上の関連情報は見つかりませんでした。頂点の実際の値を得ることは可能ですか?

私はGPUを使って頂点の位置を計算するために頂点シェーダーを使用していますが、私のアプリケーションのロジックの結果をJavascriptで取得する必要があります。 Javascriptでも計算しないとこれを行う方法はありますか?

答えて

0

Transform feedbackは、頂点の処理結果をアプリケーションコードに戻すOpenGLの方法です。しかし、これはwebgl2でしか利用できません。フィードバックのフィードバックは、頂点の代わりにプリミティブを出力し、完璧なマッチではない可能性があります。

新しい代替はimage load storeshader storage buffer objectsです。しかし、私はそれらもwebgl 2から欠けていると思います。

要するに、javascriptで同じデータを計算するか、アプリケーションロジックをシェーダに移動する必要があります。連合検出のために変換された頂点データが必要な場合は、バウンディングボックステストを使用し、バウンディングボックスヒット時にのみ頂点レベル変換を行うことができます。

マルチレベルのバウンディングボックスを使用すると、オブジェクト全体に1つの大きなボックスがあり、オブジェクトを分割する次のバウンディングボックスレベルを使用できます(たとえば、膝と足の足首)。そうすれば、javascriptは主に各フレームのすべてのオブジェクトに対して単一の境界ボックス/球体を変換するだけです。オブジェクトが近くにある場合にのみ、第2レベルのボックスを変形します。次に、オブジェクトが非常に接近している場合にのみ頂点変換を行います。

1

WebGL2では、変換フィードバック(Pauliが示唆しているように)を使用することができ、getBufferSubDataでデータを読み取ることができますが、理想的には、別の描画呼び出しでデータを使用するのであれば、リードバック遅いです。

フィードバックフィードバックは、単に頂点シェーダがその出力をバッファに書き込むことができることを意味します。

WebGL1では、頂点をフレームバッファに接続された浮動小数点テクスチャにレンダリングすることで可能です。各頂点に頂点id属性を含めます。その属性を使用してgl_Positionを設定します。あなたはgl.POINTと描画します。出力テクスチャの各ピクセルにレンダリングして、効果的にトランスフォームのフィードバックを得ることができます。あなたの結果の違いは、バッファではなくテクスチャになります。あなたは種類がわかりますa related example of that here

JavaScriptで値を返す必要がなければ、作成したテクスチャを将来の描画呼び出しの入力として使用できます。値をJavaScriptに戻す必要がある場合は、you'll have to first convert the values from floating point into a readable format (using a shader) and then read the values out using gl.readPixel

+0

webgl1のうまい解決策です。 Webgl2には、バッファデータの読み込みに使用できるgetBufferSubData関数があります。 gl.MapBufferがwebgl1から抜け落ちているのを忘れてしまった。私はネイティブglコードの作成に慣れている。 –

+0

'getBufferSubData'を指摘してくれてありがとう。確かに、WebGL2にはマップバッファがありません。これは、WebサイトにGPUメモリをマップさせる安全/簡単な方法がないためです。 – gman

関連する問題