シェーダー ミューテックスの整数テクスチャを使用して深度ピール アルゴリズムを実装しようとしています。この質問で示唆されているように、imageAtomicCompSwap(...) を使用できると思われます。
その関数のドキュメントを見て、符号なし整数のオーバーロードを選択します。
uint imageAtomicCompSwap(gimage2D image, ivec2 P, uint data);
ただし、これをどのように使用できるかは不明です。ドキュメントには次のように書かれています。
imageAtomicCompSwap は、データの値を座標 P のテクセルの値とアトミックに比較します。. . . 値が等しい場合、データはテクセルに格納され、そうでない場合は破棄されます。テクセルの新しい値を返します。
これは、関数がデータをテクセル内の既存の値と比較するように思えます。値が等しい場合、事実上何も起こりません (「データはテクセルに格納されます」が、それらは等しいので変化はありません)。値が等しくない場合、何も起こりません (「そうでない場合は破棄されます」)。次に、関数はテクセルの新しい値を返します (どちらの場合も何も起こらなかったため、これは最初のテクセルの元の値にすぎません)。明らかに私は何かが欠けています。
複雑なことに、私はこの機能を表示することさえできませんでした。書き込み:
//img2D_0 is declared "layout(r32ui) coherent restrict uniform uimage2D img2D_0"
imageAtomicCompSwap(img2D_0,coord,1u);
. . . 与えます:
0(14): エラー C1115: 互換性のあるオーバーロードされた関数 "imageAtomicCompSwap(struct uimage2D1x32, ivec2, uint)" が見つかりません
2 つの数値を渡す場合は、次のように言及する価値があります。
imageAtomicCompSwap(img2D_0,coord,1u,1u);
それは問題なくコンパイルされます。ただし、これはマルチサンプリングでのみ機能するはずです。どういうわけかマルチサンプル画像を宣言しましたか? では、A: ドキュメントの意味、B: 必要な機能が機能しないのはなぜですか? よくわかりません。