テクニックとパス

MMFでは、MMEやMMMのエフェクト仕様と同様にテクニックとパスを利用して描画の手法を決定する。
基本的なテクニックの記述方法については、MMEやMMMのエフェクト仕様も参考にするべきである。
また、シェーダーモデル3.0以下で動作するシェーダーを利用する場合は、MMMのエフェクトを参考に実装すると良い。以下の記述はMMF用に新たにシェーダーを作成する際にシェーダーモデルが高位のビルドを可能にするためのものである。

構成

エフェクトファイルは以下のように構成される。
パラメータ宣言1
パラメータ宣言2
・・・
関数1
関数2
・・・
technique10 テクニック1
{
	pass パス1
	{
		SetVertexShader(CompileShader(vs_4_0,頂点シェーダ関数名));
		SetPixelShader(CompileShader(ps_4_0,ピクセルシェーダー関数名));
	}
	pass パス2
	{
		SetVertexShader(CompileShader(vs_4_0,頂点シェーダ関数名));
		SetPixelShader(CompileShader(ps_4_0,ピクセルシェーダー関数名));
	}
}

technique10 テクニック2
{
	pass パス1
	{
		SetVertexShader(CompileShader(vs_4_0,頂点シェーダ関数名));
		SetPixelShader(CompileShader(ps_4_0,ピクセルシェーダー関数名));
	}
	pass パス2
	{
		SetVertexShader(CompileShader(vs_4_0,頂点シェーダ関数名));
		SetPixelShader(CompileShader(ps_4_0,ピクセルシェーダー関数名));
	}
}

セマンティクス

シェーダーモデル4.0以上では、シェーダーモデル3.0以前までのセマンティクスと異なる記法を持つ。
例えば、頂点シェーダーの返り値は従来までは以下のように、POSITIONセマンティクスが適用されている値を返す必要があった。
float4x4 view_proj_matrix;
float4x4 texture_matrix0;

struct VS_OUTPUT
{
   float4 Pos     : POSITION;
   float3 Pshade  : TEXCOORD0;
};


VS_OUTPUT main (float4 vPosition : POSITION)
{
   VS_OUTPUT Out = (VS_OUTPUT) 0; 

   // 位置をクリップ空間に変換
   Out.Pos = mul (view_proj_matrix, vPosition);

   // Pshade の変換
   Out.Pshade = mul (texture_matrix0, vPosition);

   return Out;
}
シェーダーモデル4.0以降では、このPOSITIONセマンティクスはSV_Positionセマンティクスへと変更される。
シェーダーモデル3.0以前を利用する場合は、MMFはシェーダーのコンパイル時にPOSITIONをSV_Positionとして解釈するようにコンパイル処理をD3DCompilerにさせるため問題ない。(予定)
よって、これは以下のように記述するべきである。
float4x4 view_proj_matrix;
float4x4 texture_matrix0;

struct VS_OUTPUT
{
   float4 Pos     : SV_Position;
   float3 Pshade  : TEXCOORD0;
};

VS_OUTPUT main (float4 vPosition : POSITION)
{
   VS_OUTPUT Out = (VS_OUTPUT) 0; 

   // 位置をクリップ空間に変換
   Out.Pos = mul (view_proj_matrix, vPosition);

   // Pshade の変換
   Out.Pshade = mul (texture_matrix0, vPosition);

   return Out;
}
また、頂点シェーダーの返り値が変換後の頂点座標1つのみで問題ない場合は、以下のようにも記述できる。
float4x4 view_proj_matrix;
float4x4 texture_matrix0;

float4 main (float4 vPosition : POSITION):SV_Position
{
   // 位置をクリップ空間に変換
   return mul (view_proj_matrix, vPosition);
}

Last edited Apr 16, 2014 at 7:12 PM by DaikonTakuan, version 2

Comments

No comments yet.