ただし、同じテクスチャの異なるピクセルを読み書きしている場合も未定義の動作ですか?
はい。
ここでキャッシングが大きな問題になります。ピクセル データを書き込む場合、必ずしもすぐにイメージに書き込まれるとは限りません。書き込みはキャッシュに保存されるため、複数のピクセルを一度に書き込むことができます。
テクスチャ アクセスも同じことを行います。問題は、それらが同じキャッシュを持っていないことです。そのため、書き込みキャッシュにあるデータを書き込んだ可能性がありますが、テクスチャ キャッシュはそれを認識していません。
さて、仕様はここでは少し手荒です。理論的には、テクスチャのある領域から読み取り、別の領域に書き込むことができます (ただし、仕様では定義されていません)。 ただし、書き込んだ場所から読み取らない限り、またその逆も可能です。明らかに、それはあまり役に立ちません。
NV_texture_barrier 拡張機能を使用すると、これを回避できます。NVIDIA の拡張機能ですが、ATI ハードウェアでもサポートされています。その仕組みは、glTextureBarrierNV
すべてのキャッシュをフラッシュしたいときに関数を呼び出すことです。そうすれば、ある場所から読み取るときに、その場所に書き込んだことを確認できます。
したがって、テクスチャの 1 つの領域を書き込み領域として指定し、別の領域を読み取り領域として指定するという考え方です。いくつかのものをレンダリングした後、リードバックを行う必要がある場合は、バリアを発射してテクスチャ領域を交換します。これはテクスチャのピンポンに似ていますが、新しいテクスチャをアタッチしたり、FBO をバインドしたり、ドローバッファを変更したりするという重い操作は必要ありません。