SAMPLE
ポストエフェクト モザイク
ポストエフェクト エッジ抽出
ポストエフェクト ぼかしを加算
ポストエフェクトをするには、描画した画面をフラグメントシェーダを利用して
再処理をする。
// 適当にシーンを描画
drawScene();
// 画面をテクスチャへコピー
glBindTexture( GL_TEXTURE_2D, id );
glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
0, 0, W, H, 0 );
// ポストエフェクト用の頂点シェーダとフラグメントシェーダをバインドする。
cgGLBindProgram( shdV );
cgGLBindProgram( shdF );
// フラグメントシェーダで利用するテクスチャを渡す。
CGparameter p = cgGetNamedParameter( shdF2, "decal");
cgGLSetTextureParameter( p, id );
cgGLEnableTextureParameter( p );
// テクスチャを画面を覆う四画形ポリゴンにはりつけて描画する。
glBegin( GL_QUADS );
glTexCoord2f( 0, 0 );
glVertex3f( -1, -1, z );
glTexCoord2f( 1, 0 );
glVertex3f( 1, -1, z );
glTexCoord2f( 1, 1 );
glVertex3f( 1, 1, z );
glTexCoord2f( 0, 1 );
glVertex3f( -1, 1, z );
glEnd();
頂点シェーダでは正規化デバイス座標系で -1 : 1 の範囲を覆うように変換しておく。
四画形の各頂点を -1 1 にしておき、モデルビュー変換、プロジェクション変換をしないでスルーさせる。
struct app {
// 頂点データ
float4 pos : POSITION;
float4 tc : TEXCOORD0;
};
struct v2f {
float4 pos : POSITION;
float4 tc : TEXCOORD1;
};
v2f main(
app IN
)
{
v2f OUT;
// -1 1 の範囲になるようにスルーさせる。
OUT.pos = float4( IN.pos.xy, -0.9f, 1 );
OUT.tc = IN.tc;
return OUT;
}
フラグメントシェーダでは描画した画面に対して適当な処理をする。
float4 main(
v2f IN,
uniform sampler2D decal
) : COLOR
{
return float4( tex2D( decal, floor( IN.tc.xy * 100 ) / 100.0f ).xyz, 1 );
}