2017-01-09 4 views
2

glDrawArraysIndirectでシェーダプログラムを起動したいとしましょう。最初に頂点数を含むバッファを持ち、その後にコマンドの他のデータが続きます。そのバッファは同じシェーダプログラムに原子カウンタバッファとしてバインドされ、頂点シェーダはいくつかのルールによって頂点数を減らしています。頂点数が最後に0でない場合は、シェーダプログラムを再起動する必要があります。これは、頂点数が0になるまで行われます。連続したglDrawArraysIndirectコール

しかし、プログラムのリニューアルが必要かどうかを知る最も良い方法は何ですか?データ(頂点数)を読み取らずにこれを完全に行うことは可能ですか?そうでない場合は、データを読み取る最も効率的な方法は何ですか?私は現在、シェイダープログラムをループ内で実行しています。反復の固定数は、頂点数を0に減らすことが保証されていますが、このアプローチでは、0頂点(それぞれ約3ms)で描画する時間を捨ててしまいます。 、またはそれはまだデータを読み返すことよりも優れていますか?私は10回のドローコールを持っています。通常、頂点数は3 - 6回目のドローコールで0です。

+0

「*約3msごとに」「GPU時間またはCPU時間? –

+0

私はあなたがそこで何をしているのか本当に知りたいです。私は、あなたが物事を複雑にしていると感じています。 – thokra

+0

@Nicol Bolas GPUの時間、私はタイマーのクエリでそれを測定しました。 – FamZ

答えて

2

すべてのCPUリードバック操作は、GPUにこのようなものを残すよりも高速である可能性は非常に低いです。これは、完全なGPU/CPU同期を引き起こさなければならないため、パイプライン化と非同期実行の希望をなくすからです。

あなたがやっていることを効率的に行う方法が、あなたが何をしているのか正確には言わないときには、何が言えるのですか。たとえば、各レンダリングコマンドの反復回数を計算することを唯一の仕事とする計算シェーダを開発することは合理的でしょうか?そうであれば、CS呼び出しは一連の間接レンダリングコマンドを構築することができ、glMultiDrawIndirect経由でワンショットでディスパッチできます。

関連する問題