2012-04-11 8 views
1

、私はGLSL 4.2で次の操作を実行したいと思います:GLSL 4.2画像のロードとストア&メモリバリア

vec3 someColor = ...; 
vec4 currentPixel = imageLoad(myImage, uv); 
float a = currentPixel.a/(currentPixel.a+1.0f); 
vec4 newPixel = vec4(currentPixel.rgb*a+someColor*(1.0f-a),currentPixel.a+1.0f); 
imageStore(myImage, uv, newPixel); 

「UV」の値は、複数のラスタライズされたピクセルに対して同じにすることができます。適切な結果を得るために、私はimageLoad()とimageStore()の呼び出しの間に、他のシャドー実行を私のピクセルに書き込む必要はありません。

memoryBarrierで何とかできますか?もしそうなら、このコードでどのように使わなければならないのでしょうか?

答えて

2

'uv'の値は、複数のラスタライズされたピクセルで同じにすることができます。

それではできません。

memoryBarrierは、アトミック操作を作成する方法ではありません。 は、1つのシェーダの操作の順序を保証します。したがって、特定のシェーダ呼び出しがイメージを読み込んでそれを書き込んだ後に再度読み込む場合は、読み込まれたものが以前に書き込まれたものであることを確認するためにはmemoryBarrierが必要です。 他のシェーダの呼び出しがそれに書き込んだ場合、あなたは運が悪いです(依存する呼び出しでない限り、このようなルールは複雑です)。

プログラムブレンドを実行する場合は、各フラグメントシェーダの呼び出しがユニークなの値を読み書きするようにする必要があります。さもなければ、それはうまくいかないでしょう。

あなたは実際に達成しようとしていることを言っていないので、あなたが望むものを得るためのより良い方法を提供することはできません。私が言うことができるのは、です。方法は動作しません。

+0

大丈夫 - まだthoght。説明をいただきありがとうございます。はい、私はブレンドをしようとします。私はImageAtomicAdd(..、vec4(someColor、1.0f))を使うことができ、ピクセルを.a値で区切って読み込むこともできますが、ピクセルは最初に既に色と重量を持っているという問題があります。 0と1の間のどこか – user1282931

+0

@ user1282931:ブレンドをしようとしている場合、なぜ同じ値に複数のフラグメントが書き込まれていますか? –

+0

反射マップ上にある程度逆投影されています。レンダリングされた反射は、オブジェクトノーマルのピクセルと同様に存在し、これからリフレクションマップは近似されるべきである - したがって、複数のフラグメントが同じ反射テクセルにマッピングされ、ノイズを避けるために、 – user1282931

0

ロックシステム(ロック/ミューテックス)を実装する必要があります。 この目的のためには、imageAtomicCompSwapを使用するか、またはbufferが使用されている場合は、atomicCompSwapを使用することをお勧めします。もちろん、ローカル変数ではなくグローバル変数(テクスチャ)を使用する必要があります。実装の目的のために

は、私はこの質問はあなたの問題の大部分の答えであると思う:Is my spin lock implementation correct and optimal?