1

画像の読み込みと保存を使用して、GLSL4.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()の呼び出しの間に他のshaderexecutionがピクセルに書き込みを行わないようにします。

これはmemoryBarrierでどういうわけか行うことができますか?もしそうなら、それはこのコードでどのように使用されなければなりませんか?

4

2 に答える 2

2

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

その後、あなたはそれを行うことはできません。

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

プログラムによるブレンディングを実行しようとしている場合は、各フラグメントシェーダーの呼び出しが一意の値に対して読み取り/書き込みを行うことを確認する必要があります。そうしないと、機能しません。

あなたは実際に何を達成しようとしているのかを言わないので、あなたが望むものを手に入れるためのより良い方法を提供することは不可能です。私が言えるのは、この方法はうまくいかないということだけです。

于 2012-04-11T18:38:14.523 に答える