フラグメントシェーダは2つのアトミックカウンタを使用します。それは最初のものをインクリメントすることもインクリメントすることもできないこともあります。ただし、カウンターを変更する前に、現在の値が常に読み取られます。カウンターが後で変更されると、以前に読み取られた値がカスタムロジックに使用されます。すべてこれは(ほとんど可能性のあるunrollable)ループで発生します。フラグメントシェーダのGLSLアトミックカウンタ(および分岐)
Envisionのおおよそこのような流れ:いくつかの小さなunrollableループで
- 、(コンパイル時に解決可能なのconst)0-20 FOR言う...
- はAC1とAC2 のカウンタ値を取得します
- チェックいくつかの値:
- 場合X:インデックスAC1、
- 他増分AC1でuimage1D_Aに設定テクセル:インデックスでuimage1D_Bに設定テクセル(imgwidth-AC2-1)、インクリメントAC2
質問:シェイダーは現在のカウンタ値を照会します。常に最新の値を取得していますか?現在の世代のGPUと将来のGPUとドライバに関してのみ、フラグメントシェーダの大規模な並列処理をここで失うことはありますか?分岐として
(もしx) - Iは、(uniform
)uint
に別の(readonly restrict uniform
)uimage1D
におけるテクセルを比較します。だから1つのオペランドは間違いなく均一なスカラーですが、もう1つはimageLoad().x
ですが、画像は一様ですが、この種の分岐はまだ完全に並列化されていますか?両方のブランチがまったく同じ2つの命令であることが分かります。 「完全に最適化された」GLSLコンパイラを仮定すると、この種の分岐はおそらくストールを招くでしょうか?
明確化してくれてありがとうと警告を:) – metaleap