2

シェーダー ミューテックスの整数テクスチャを使用して深度ピール アルゴリズムを実装しようとしています。この質問で示唆されているように、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: 必要な機能が機能しないのはなぜですか? よくわかりません。

4

1 に答える 1

2

その機能のドキュメントを調べる

おっと、それらのページは解決するよりも多くの問題を引き起こします...

要するに、ドキュメントが壊れています。仕様(つまり、重要なドキュメント)には、関数が次のように定義されていると記載されています。

uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data)

IMAGE_PARAMSイメージ ユニフォームとそのイメージ ユニフォームに適したテクスチャ座標はどこにありますか。1D 画像の場合、image1Dint;が必要です。2D 画像の場合、 と が必要image2Dですivec2。等

画像の値を と比較することで機能しcompareます。それらが等しい場合はdata、この場所に格納されます (スワップイン)。それ以外の場合、スワッピングは行われません。戻り値は、条件付きスワップが行われる前にこの場所に格納されている値になります。

于 2012-08-04T12:24:58.837 に答える