2017-01-01 1 views
1

2つの計算シェーダを使用するアプリケーションがあります。 Shader #1はデータxを生成し、これを追加バッファとしてバインドされたAに格納します。 Shader #2は、消費バッファーとして結合されたAからxのすべてで実行されます。 私は新しいバッファByを生産、Axのすべての上で動作する、Shader #3を追加することで、これを拡張したいと思います - しかし、私はまだShader #2は以前のようにx上で実行したいです。GPUに追加/消費バッファのカウンタを設定しますか?

つまり、「消費する」ことなく、追加/消費バッファのすべての要素に対して操作を実行したいとします。

私が正しく理解していれば、要素を消費するだけで隠しカウンターが減少するので、カウントが満杯になるとバッファを何度も消費し、消費するシェーダー呼び出し間でリセットする必要があります。

私のプラットフォーム(Unity)には、このために1つの方法しかありません(SetCounterValue())ので、新しいカウンタ値を渡す必要があります。つまり、GPU/CPU間の同期を強制してパフォーマンスを低下させるように、CPUのメモリを再設定する前にカウンタ値を取得する必要があります。

消費バッファのカウンタ値をGPUに設定することはできますか?

もしそうでなければ、消費を使わずに消費バッファを反復することは可能ですか?

(普通のUAVリソースとしてバッファをバインドし、その方法を反復するために私に発生しましたが、the documentationが、これはサポートされているかどうかが曖昧である。Egはありません「これらのリソースは、リソース変数を使用しないでください。」を参照してください

答えて

0

これを行う通常の方法(私が理解しているところでは、私は間違いなくDirectComputeのエキスパートではありません)は、2つのバッファを持つことです。 ComputeBufferType.DefaultバッファーでシェイダーでRWStrucutedBuffer<YourStruct>と宣言し、インデックスバッファーをUnityでComputeBufferType.Appendとして作成し、シェイダーでConsumeStrucutredBuffer<uint>またはAppendStructuredBuffer<uint>と宣言しました。

インデックスバッファは、メインバッファへのインデックス参照のリストで、どの要素が非アクティブであるかを指定します。

また、 'isAlive'などと呼ばれるデータ構造体にintを追加することもできます。

その後、次の3つのシェーダを作成したい:

  • あなたが行う前に、あなたがif(isAlive < 1) returnようなものを持っている以外、通常から変更されません。あなたがメインのデータにすべての作業を行うシミュレーションシェーダ、あなたの仕事の大部分。
  • あなたがリストからそれらを消費することにより、主な要素を「作成」そうindexBuffer[932] = 932など(インデックスリストがAppendStructuredBuffer<uint>として初期化される指標()
  • あなたのEMITシェーダ、とあなたのインデックスバッファを移入あなたのインデックスセットアップシェーダ、利用可能なインデックスとisAlive = trueを設定します(インデックスリストはConsumeStrucutredBuffer<uint>として初期化されます)。

また、シミュレーションシェーダで、インデックスバッファをAppendバッファとして宣言し、特定の条件が満たされている場合は、シミュレーションインデックスをisAlive = falseに設定し、インデックスをインデックスバッファに追加することで 'kill' 。

関連する問題