2017-11-10 7 views
0

Metalアプリケーションでオーダーに依存しない透過性のためにA-Bufferアルゴリズムを実装したいと考えています。この技術の説明では、原子カウンタを使用して説明しています。私はこれらのうちの1つを使用したことはありませんし、それらについても聞いたことがありませメタルシェーディング言語仕様の原子変数について読んだだけですが、実際に実装または使用する方法を理解することはできません。メタルフラグメントシェーダでアトミックカウンタを実装/使用する方法は?

誰もメタルでこれらの経験がありますか?単純な整数カウンタを設定して使用する方法の例を教えてください。基本的には、各レンダーパスでは、ゼロから始まるフラグメントシェーダ内から整数をインクリメントできる必要があります。これは、Aバッファにインデックスを付けるために使用されます。

ありがとうございます!

答えて

2

あなたの質問には、一般的な概要よりはるかに多くの詳細が不足しています。不完全なシェーダ関数を追加することも考えられます。疑似コードでは、何かを実装する方法がわからない場合があります。

とにかく原子カウンターは、タイプatomic_uint(または符号が必要な場合はatomic_int)の変数です。有用であるためには、特定のアドレス空間で変数を共有する必要があります。あなたの例は、アドレス空間が必要なように聞こえる。したがって、device変数がバッファによってバックアップされたほうがよいでしょう。また、あなたのatomic_uint変数を可能パラメータの構造体の型を使用し、構造体のフィールドを持つことができ

fragment FragmentOut my_fragment_func(device atomic_uint &counter [[buffer(0)]], ...) 
{ 
    ... 
} 

:あなたはとしてそれを宣言します。

アトミック1でアトミック変数をインクリメントし、以前の値を取得するには、あなたがこれを行うことができます:

uint value = atomic_fetch_add_explicit(&counter, 1, memory_order_relaxed); 

アトミック変数の初期値は前の時点でバッファの内容から取られますドローまたはディスパッチコマンドが実行されます。これは仕様書には記載されていませんが、原子タイプのサイズとビット解釈は、対応する非原子タイプと一致するようです。つまり、uint(a.k.a. 012.またはuint32_t)をバッファに書き込んでatomic_uintを初期化します。

+0

ありがとう、それは素晴らしい説明です!一般的な概要はまさに私が必要としていたものです。申し訳ありませんが詳細を提供していませんでした。シェーダを書き始めませんでした。 – bsabiston

関連する問題