2017-08-06 8 views
0

計算シェーダでいくつかの作業を行っていますが、2つの呼び出しがimageStoreを使用してテクスチャ上の同じ場所に書き込むと、アクセス後にテクスチャがレンダリングされたときにちらつき現象が発生する速度は保証されていないので、ある呼び出しが最後に到着し、時にはもう一方の呼び出しが最後に到着することもあります。私は最終的な色の値が、例えば赤の値が最も高い値になるようにしたいと思います。シェイダー内でそれを判断する方法はありますか?計算シャドウ呼び出しが競合する

私はいくつかの混乱があったと思いますので、私はちょっとした情報を提供します。私はGL_UNSIGNED_BYTEとしてCPUにバインドされてきたデータで働いている、と私はそれがこの段階で

layout (r8, binding = 0) uniform image3D visualTexture;

を使用してアクセスし、私は単純にちらつきを停止する、すなわち、いくつかのシェーダ呼び出しがかかります他のものより優先されます。最高の価値は理想的ですが、私はこれを速くしたいと思います。

+0

アトミック操作を使用できますか? またはおそらく障壁も役に立ちます –

+0

私はそれについて考えましたが、私の問題は書き込み操作が1つしかないということです。書き込みは原子的に行うことはできないと思います。 – irishMTS

+0

私は部分的に正しいと思いました。アトミック操作は32ビットイメージでのみ機能しますが、使用しているイメージは8ビットです。これは問題になりますか? – irishMTS

答えて

1

Image atomic operationsは、シングルチャネルの32ビット形式(整数と浮動小数点数)でのみ使用できます。したがって、データを変更して8ビットの整数ではなく32ビットの整数を使用し、imageAtomicMaxを使用して値をイメージに設定してください。

32ビット整数バッファを仲介として使用するだけで、32ビットデータを読み込んで8ビットバッファに書き出す後処理を行うことができます。

+0

この回答を完成させるには、リスト:http://developer.amd.com/wordpress/media/2013/06/2041_final.pdf –

+0

申し訳ありませんが、私はそれをもう少し明確にしました。私は1つのチャンネルで作業していますが、これを助けるなら 'GL_UNSIGNED_BYTE'としてCPUにバインドしました – irishMTS

+0

@irishMTS:32ビット整数にして、' imageAtomicMax私が言ったように;)答えが更新されました。 –

関連する問題