実装方法
ポストエフェクトに必要なものはすでにBasicPostEffect.fxに実装してあるので、これを元に簡単に解説します。
ポストエフェクトとしての宣言
ポストエフェクトを作成する際には、必ず以下の記述が必要です。
float Script : STANDARDSGLOBAL < string ScriptOutput = "color"; string ScriptClass = "scene"; string ScriptOrder = "postprocess"; > = 0.8;
これは、このエフェクトファイルがポストエフェクトであることを宣言するもので、これがないと後述するScriptExternalコマンドなども使用できません。基本的に、パラメータは変更せず、このまま記述して使用します。
描画結果を受け取るためのテクスチャを作成
ポストエフェクトの処理のためには、描画の出力先(レンダーターゲット)となる、特殊なテクスチャを用意する必要があります。
これには、以下のように記述します。
// レンダーターゲットテクスチャ texture ScnMap : RENDERCOLORTARGET < float2 ViewPortRatio = {1.0,1.0}; >; // 深度バッファ texture DepthBuffer : RENDERDEPTHSTENCILTARGET < float2 ViewPortRatio = {1.0,1.0}; >;
"RENDERCOLORTARGET"が指定されたtextureパラメータは、描画結果の色情報を記録できるテクスチャとなります。また、"RENDERDEPTHSTENCILTARGET"が指定されたtextureパラメータは、深度バッファ(Zバッファ)となります。
レンダーターゲットを変更する際には、必ずこの2種類のtextureパラメータがそれぞれ必要となります。
上記のとおりに設定すると、それぞれのテクスチャは、スクリーンと同じサイズで生成されます。これらのパラメータの詳細については、MME同梱のREFERENCE.txtを参照ください。
また、テクスチャに出力された描画結果をシェーダから参照するために、「サンプラ」と呼ばれるものを作成します。これをtex2D()関数の第1引数に指定することで、シェーダ内でこのテクスチャに記録された色情報が取得できます。
//テクスチャを読み取るためのサンプラ sampler ScnSamp = sampler_state { texture = <ScnMap>; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = NONE; };
テクニックのスクリプトでレンダーターゲットを変更
レンダーターゲットの変更処理は、テクニックに「スクリプト」と呼ばれる特殊なコマンド列を記述することで行います。下記の、"string Script = "で始まる一連の文字列がそれにあたります。
technique PostEffect < string Script = "RenderColorTarget0=ScnMap;" "RenderDepthStencilTarget=DepthBuffer;" "ClearSetColor=ClearColor;" "ClearSetDepth=ClearDepth;" "Clear=Color;" "Clear=Depth;" "ScriptExternal=Color;" "RenderColorTarget0=;" "RenderDepthStencilTarget=;" "Pass=DrawBuffer;" ; > { pass DrawBuffer ... { ... } }
これら一行一行がコマンドになっていて、それぞれ以下の処理を行います。
-
レンダーターゲットを用意したテクスチャで変更
"RenderColorTarget0=ScnMap;" "RenderDepthStencilTarget=DepthBuffer;"
-
レンダーターゲットを指定した背景色でクリア
"ClearSetColor=ClearColor;" "ClearSetDepth=ClearDepth;" "Clear=Color;" "Clear=Depth;"
-
他のオブジェクトを現在のレンダーターゲットに対して描画
"ScriptExternal=Color;"
-
レンダーターゲットをスクリーンに戻す
"RenderColorTarget0=;" "RenderDepthStencilTarget=;"
-
パス"DrawBuffer"を実行
"Pass=DrawBuffer;"
これについても、詳しくはMME同梱のREFERENCE.txtを参照ください。