OpenGL で一種のフィルターとして使用するための標準的な手順は何ですか? フィルターと言うときは、エッジ検出のようなものを意味します。たとえば、SSAO フィルターを FBO に適用するとします。FBO と深度バッファをテクスチャにバインドしてから、別の FBO に描画しながらシェーダを使用しながら、カメラの前にクワッドを描画しますか? それは私が今までやってきたことですが、それはちょっと面倒でした。ほとんどの人が使っている一般的な慣習を知りたいです。私はおそらくここでかなり大きなものを見逃しています。私は LWJGL を使用しているので、それが問題になる場合でも大げさではありません。
2 に答える
それがまさに常識です。(FBO を使用して) シーンを 1 つまたは複数のテクスチャに描画し、テクスチャ付きの画面サイズのクワッドを描画してそれらのテクスチャをフィルタリング シェーダーにフィードし、結果を別のテクスチャにレンダリングします (別のまたは同じ FBO を使用して)。または終了時にデフォルト(ディスプレイ)フレームバッファに直接。
現在 (OpenGL 4.3 ハードウェアとドライバーを使用)、さらに別のオプションがあります。このようなタスクにはCompute Shaderを使用することもできます。これは基本的に、他のすべてのシェーダー ステージとは対照的に、通常のグラフィックス パイプラインの一部ではなく、一般的な GPGPU プログラミング モデル (CUDA または OpenCL で知られている) を OpenGL に公開する特別な種類のシェーダーです。画像のロード/ストアやテクスチャ フィルタリングなどの OpenGL データ構造と機能。(実際、OpenGL との相互運用を可能にする CUDA や OpenCL を使用することもできますが、これはかなり面倒であり、画像フィルタリングのようなグラフィックス ドメインにうまく適合するタスクには価値がありません。しかし、学習と相互運用がゼロのシェーダーを計算します。オーバーヘッドにより、これは使用可能な代替手段になります)。
それがあなたのやり方です、画面サイズのクワッドを描きます。画面のどの部分をフィルタリングするかを OpenGL に伝える必要があります。また、OpenGL はラスタライザーであるため、フラグメント シェーダー (クワッド) に何をフィードするかを知るために、その部分をラスタライズする必要があります。