写真を扱うOpenGL ESプログラムがあります。現在のピクセルを処理する場合、以前のピクセル値を使用する必要があります。ただし、マスターマップのピクセル値ではありません。処理済みの以前のピクセル値です。
再帰はフラグメント シェーダで実行できますか?
フラグメント シェーダーは固定された順序で適用されず、グローバル ステートに副作用はありません。問題は、何を前のピクセルと見なすかです。
たとえば、左から右、上から下への画像スキャンなどを行うアルゴリズムを作成する場合は、出力を生成するために必要なすべてのソース ピクセルを明示的にサンプリングする必要があります。特定のピクセルにそのピクセルの左に 3 を加えたものである場合、そのピクセルに左に 3 を加えたものを明示的に取得する必要があります。アルゴリズムの例は、Floyd-Steinberg ディザリングです。
前のフレームについて話している場合は、ピンポン バッファリングを使用してそれを実現します。これにより、テクスチャへのレンダリングを使用し、前のフレームを入力テクスチャとして扱うことができるように、ある目的地と別の目的地の間で切り替えることができます。アプリケーションの例としては、iTunes のアプリケーションを含め、ミュージック ビジュアライザーが通常行うようなものがあります。
OpenGL ES 2.0 仕様では、以前のピクセル値にアクセスする手段が提供されていません。
ただし、一部の GPU には、フレームバッファの現在のフラグメント値にアクセスできるベンダー固有の拡張機能があります。私が知っているのはNV_shader_framebuffer_fetch
(Appleには同様の拡張子がありますAPPLE_shader_framebuffer_fetch
)です。Tegra 2では、読み取り専用gl_LastFragColor
変数から GLSL のフラグメントの以前の値を取得できます。この機能は、フラグメント シェーダーでのカスタム ブレンドに使用するためのものです。ただし、 nVidia Tegra GPUでのみ使用できます。
この拡張機能の詳細については、https ://developer.nvidia.com/sites/default/files/akamai/mobile/files/tegra_gles2_development.pdf をご覧ください。