6

特定のシーンをテクスチャにレンダリングしていて、その画像を簡単な方法で処理する必要があります。私が今これをどのように行っているかは、を使用してテクスチャを読み取りglReadPixels()、CPU で処理することです。ただし、これでは遅すぎるため、処理を GPU に移行することを考えていました。

これを行うための最も簡単な設定は、正射影でビューポート全体を占める単純な白いクワッドを表示し、画像処理ビットをフラグメント シェーダーとして書き込むことです。これにより、処理の多くのインスタンスを並行して実行できるだけでなく、処理に必要なテクスチャのピクセルにアクセスすることもできます。

これは実行可能な行動方針ですか?このように物事を行うのは一般的ですか?それを行うためのより良い方法はありますか?

4

2 に答える 2

2

はい、これが通常のやり方です。

  1. 何かをテクスチャにレンダリングします。
  2. そのテクスチャを読み取り、いくつかの操作を行うシェーダーを使用してフルスクリーン クワッドを描画します。

単純な効果 (グレースケール、色補正など) は、フラグメント シェーダーで 1 つのピクセルを読み取り、1 つのピクセルを出力することで実行できます。より複雑な操作 (渦巻き模様など) は、オフセット位置から 1 ピクセルを読み取り、1 ピクセルを出力することで実行できます。複数のピクセルを読み取ることで、さらに複雑な操作を実行できます。

場合によっては、複数の一時テクスチャが必要になります。たとえば、半径の大きいぼかしは、次の方法で行うことがよくあります。

  1. テクスチャにレンダリングします。
  2. 各出力ピクセルを複数のソース ピクセルの平均として計算するシェーダーを使用して、別の (小さい) テクスチャにレンダリングします。
  3. この小さなテクスチャを使用して、適切なガウス ブラーまたは何かを行うシェーダーを使用して、別の小さなテクスチャにレンダリングします。
  4. ... 繰り返す

ただし、上記のすべての場合において、各出力ピクセルは他の出力ピクセルから独立している必要があります。もう 1 つ入力ピクセルを問題なく使用できます。

適切にマッピングされない処理操作の例は、各出力ピクセルが入力ピクセルと隣接する出力ピクセルの値に依存する Summed Area Table です。それでも、これらの種類を GPU で実行することは可能です ( example pdf )。

于 2009-01-08T09:50:56.987 に答える
2

はい、画像処理を行う通常の方法です。すべてのピクセルの色を設定する場合、クワッドの色はあまり重要ではありません。アプリケーションによっては、ピクセル サンプリングの問題に注意する必要がある場合があります (つまり、2 つのピクセルの中間ではなく、ソース テクスチャの正確なピクセルからサンプリングするようにします)。

于 2009-01-08T09:52:19.387 に答える