ポストエフェクト(PostEffect)

SAMPLE https://www.dropbox.com/s/zrmtc19qth73eao/posteffect_mosaic_cg.exe( ポストエフェクト モザイク ) https://www.dropbox.com/s/f7zi9arj8mrzeom/posteffect_edge_cg.exe( ポストエフェクト エッジ抽出 ) https://www.dropbox.com/s/i0xqk4jn5c8scj0/posteffect_bloom_cg.exe( ポストエフェクト ぼかしを加算 ) ポストエフェクトをするには、描画した画面をフラグメントシェーダを利用して 再処理をする。
// 適当にシーンを描画 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 ); }