掲題の件、意外にもダイレクトな方法の紹介がネットの大海に無かったので備忘としてポストします。
(クリエイティブコーディングのよろず屋 yoppa.org にも方法が載ってなかった…。)

ofShaderインスタンス内メソッドのbegin()end()の間に物体を描くと、その物体にシェーダマテリアルを貼り付けることができます。

ofMatrialと使い方は一緒で便利でる。

しかし今回やりたいのは、シェーダマテリアルではなく、ポストエフェクトです。
一度レンダリングした画面の全体にエフェクトをかけるというものです。

手順としてはこんな感じです。
1) FBO(Frame Buffer Object)に、一度絵を描き込む
2) 1)で描かれたFBOをシェーダにTextureとして渡し、出力する色を計算
3) 2)の計算結果を画面にぴったりあった四角形にシェーダマテリアルとして貼り付け

以下、順番に概観します。

手順

1) FBO(Frame Buffer Object)に、一度絵を描き込む

Frame Buffer Object(以下FBO)とは1つの描画結果としてのframeを、一時的に保管して持っておくためのオブジェクトです。
px単位で、色情報(color buffer)、深度情報(depth buffer)など、描画に必要な情報を持っています。
FBOについての解説は、こちら が詳しいです。
openFrameworksでの使い方は、ありがたいことにとても単純化されており超簡単です。

この書き方どこかで見たことがありますね。

begin()とend()ではさむというoFにおける単純化のパターンですね。
このように書き方を単純化しつつ統一性をもたせてくれるのはラッパーライブラリとしてのoFの素晴らしいところです。

2) 1)で描かれたFBOをシェーダにTextureとして渡し、出力する色を計算

1)で描いたFBOはいわば一枚の絵です。これをTextureとしてシェーダプログラムに渡します。
シェーダへの渡し方はおまじない的に覚えてしまった方が良いかもしれません。

ofShaderインスタンスのsetUniformTexture()メソッドで渡します。

第一引数は、シェーダ側での変数名と同じにし、第二引数にTextureとなるオブジェクトを渡します。
今回はofFboのインスタンスですが、ofBaseHasTexture
を継承しているものであれば指定可能です。(ofImagegetTexture()を使えば、同じように ofBaseHasTexture を継承した ofTexture にアクセスでき、shader に渡せます。)

フラグメントシェーダ側では以下のように渡したFboのTextureから色情報を取り出します。

取り出したらあとは適当にいじくります。いじくったあとは、gl_FragColor(vec4型。rgbaを意味する4つのfloat値の集合)に代入すれば、描画結果として得ることができます。

関数名については、GLSLのバージョンによって変わったりしますので注意が必要です。
GLSLのバージョンについては こちらの記事 がとても参考になります。

3) 2)の計算結果を画面にぴったりあった四角形にシェーダマテリアルとして貼り付け

2)で計算した色は、シェーダマテリアルとして画面をぴったりと覆う四角形に貼り付けます。
図形へのシェーダマテリアルのはりつけは冒頭に紹介したとおりですね。
ofShaderのインスタンスのbegin()とend()で挟めばOKです。

サンプル

最後に冒頭の動画の完成版のコードを掲載します。
このサンプルのポストエフェクトはグラデーションを時間差で強弱をつけながら上乗せするという単純なものです。

oF C++ヘッダーファイル

oF C++ファイル

頂点シェーダ

フラグメントシェーダ

参考