まず、OpenGL 3 以降では、単一のフラグメント シェーダーから複数の出力を計算できます。フレームバッファ オブジェクトは、gl_FragColor の代わりに gl_FragData[n] を使用して、複数の RGBA サーフェス (Renderbuffer オブジェクト) をアタッチし、それぞれの RGBA を生成できます。第 5 版 OpenGL SuperBible の第 8 章を参照してください。
ただし、複数の出力は、各バッファー内の同じ X、Y ピクセル座標に対してのみ生成できます。これは、古いスタイルのフラグメント シェーダーが 1 つの出力しか生成できず、gl_FragCoord を変更できないのと同じ理由です。OpenGL は、任意のプリミティブをレンダリングする際に、1 つのフラグメント シェーダーのみが宛先フレーム バッファー内の任意の X、Y ピクセルに書き込むことを保証します。
フラグメント シェーダーが異なる X、Y 座標で複数のピクセル値を生成できる場合、同じフラグメント シェーダーの別の実行と同じ宛先ピクセルに書き込もうとする可能性があります。フラグメント シェーダーがピクセル X または Y を変更できる場合も同様です。これは、共有メモリの問題を更新しようとする従来の複数スレッドです。
それを解決する 1 つの方法は、「これが発生した場合、結果は予測不能です」と言うでしょう。これは、完全に制御できないため、プログラマーの観点から言えば最悪です。または、フラグメント シェーダーが更新中のピクセルをロックする必要があるため、GPU がはるかに複雑で高価になり、パフォーマンスが低下します。または、フラグメント シェーダーは、ロックを必要としない並列ではなく、定義された順序 (左上から右下など) で実行されますが、パフォーマンスはさらに低下します。