2

1つだけではなく、フラグメントシェーダーでピクセルの束を計算することを取り除くために、ある種のOpenGLマジックに精通している人はいますか? 特に、この問題は OpenGL ES にとって重要であり、実際にはモバイル プラットフォームに欠陥があり、(パフォーマンスの意味で) より正確な方法で物事を行う必要があります。

結論やアイデアはありますか?

PS は、GPU アーキテクチャの編成により、既知のシェーダーであり、テクスチャ モナドごとに並列に実行されます。しかし、1 つのピクセルからピクセルのグループに上げたり、独自の glTexture 組織を実装したりするテクニックがあるかもしれません。GPU 内では、この方法で多くの作業をより高速に実行できます。

4

2 に答える 2

5

まず、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 がはるかに複雑で高価になり、パフォーマンスが低下します。または、フラグメント シェーダーは、ロックを必要としない並列ではなく、定義された順序 (左上から右下など) で実行されますが、パフォーマンスはさらに低下します。

于 2013-07-15T04:12:41.867 に答える