4

計算シェーダーで 0 ~ 12 個の三角形を生成している場合、それらをバッファーにストリーミングして、画面へのレンダリングに使用する方法はありますか?

私の現在の戦略は次のとおりです。

  • float3sizeのバッファを作成するため、threads * 12可能な最大数の三角形を格納できます。
  • グリッド内のスレッド位置に依存するインデックスを使用してバッファーに書き込むため、競合状態は発生しません。

ただし、これからレンダリングする場合は、空のメモリをスキップする必要があります。それは醜いように聞こえますが、おそらく今のところ他に方法はありません。CUDA ジオメトリ シェーダーが可変長の出力を持つことができることは知っていますが、iOS のゲームが GPU で可変長のデータを生成できるかどうか、またはどのように生成できるかは疑問です。

更新 1 :

質問を書いてすぐに、各ブロックで使用可能な三角形の数を示す 2 つ目のバッファーを使用する可能性について考えました。頂点シェーダーは、そのブロックのすべての三角形のすべての頂点を処理します。

ただし、これは未使用のメモリの問題を解決しません。また、多数のスレッドがあるため、無駄になるメモリの合計はかなりの量になります。

4

1 に答える 1

4

あなたが探しているのは、D3D の「AppendStructuredBuffer」に相当する Metal です。アトミックに構造を追加できる型が必要です。

私は Metal に詳しくありませんが、独自の Append Buffer をロールするために本当に必要な「追加」などのアトミック操作をサポートしています。カウンターを 0 に初期化し、各スレッドにカウンターに「1」を追加させ、元の値をインデックスとして使用してバッファーに書き込みます。

于 2015-08-16T10:37:02.650 に答える