定数バッファ(cbuffer)

解説

MMFでは、シェーダーモデル4.1以上が使えるので、cbufferを利用することが可能です。
勿論、MME/MMM形式のマテリアル情報のやりとりもそのまま動きます。
シェーダーモデル3.0を利用しているMME/MMMでは、マテリアル情報を例えば以下のようにやりとりします。
float4 AmbientColor:AMBIENT<string object="Geometry";>;
float4 DiffuseColor:DIFFUSE<string object="Geometry";>;
float4 SpecularColor:SPECULAR<string object="Geometry";>;
float SpecularPower:SPECULARPOWER<string object="Geometry";>;
この場合、内部的には変数の受け渡しは4つの変数にそれぞれ1回ずつ、計4回に分けて行われます。
定数バッファはシェーダーモデル4.0以上で使用できるバッファです。このような定数を1回でまとめて渡すことができるとともに、定数バッファは読み書きが非常に速くできるようになっています。例えば、以下のように記述します。
cbuffer BasicMaterialConstant
{
	float4 AmbientColor:packoffset(c0);
	float4 DiffuseColor:packoffset(c1);
	float4 SpecularColor:packoffset(c2);
	float SpecularPower:packoffset(c3);
}
cbufferに対してはセマンティクスを指定することができないため、変数名を用いて識別します。(指定してもコンパイルは通りますが、認識されません。)
また、それぞれの要素はpackoffsetのオフセット量に応じて、入る値が決まっています。packoffsetの値さえ変えなければ、定数バッファ内の並び順も変更可能です。
例えば上記の例では、BasicMaterialConstantはMMFでは特殊な定数バッファとして認識されます。この定数バッファ名が適用されている定数バッファに対しては、上記のcbufferの定義に基づいてデータを渡そうとします。また、定数バッファ名の大文字小文字による差は認識されません。
また、定数バッファ内の要素の変数名、セマンティクスも考慮されません。(cbuffer内の要素の変数名は自由ということです。)
上記の2つは一見違う実装に見えますが、変数の定義のみ異なり、使用は以下のようにカンタンに利用可能です。
float4 PS_DiffuseColor():SV_Target
{
return DiffuseColor;
}
定数バッファは、一度に定数を渡す機構であり、利用に際しては旧来のグローバル変数のように扱えます。
また、MMFでは定数"MMF"が定義されることを利用して、以下のように記述することでMME/MMMと互換性を維持したままパフォーマンスを向上することが期待できます。
#ifdef MMF
cbuffer BasicMaterialConstant
{
	float4 AmbientColor:packoffset(c0);
	float4 DiffuseColor:packoffset(c1);
	float4 SpecularColor:packoffset(c2);
	float SpecularPower:packoffset(c3);
}
#else
float4 AmbientColor:AMBIENT<string object="Geometry";>;
float4 DiffuseColor:DIFFUSE<string object="Geometry";>;
float4 SpecularColor:SPECULAR<string object="Geometry";>;
float SpecularPower:SPECULARPOWER<string object="Geometry";>;
#endif

定義済み定数バッファ名

BASICMATERIALCONSTANT

説明
ジオメトリの色の演算に必要なセット。
定義
cbuffer BasicMaterialConstant
{
	float4 [Ambient色変数名]:packoffset(c0);
	float4 [Diffuse色変数名]:packoffset(c1);
	float4 [Specular色変数名]:packoffset(c2);
	float [反射強度変数名]:packoffset(c3);
}
要素
変数型 上の 定義での表示 パックオフセット 説明
float4 Ambient色変数名 c0 float4 AmbientColor:AMBIENT<string object="Geometry";>;と同一
float4 Diffuse色変数名 c1 float4 DiffuseColor:DIFFUSE<string object="Geometry";>;と同一
float4 Specular色変数名 c2 float4 SpecularColor:SPECULAR<string object="Geometry";>;と同一
float 反射強度変数名 c3 float SpecularPower:SPECULARPOWER<string object="Geometry";>;と同一

FULLMATERIALCONSTANT

説明
材質に与えられる数値の全てを取得する際に利用する。
定義
cbuffer FullMaterialConstant
{
	float4 AmbientColor:packoffset(c0);
	float4 DiffuseColor:packoffset(c1);
	float4 SpecularColor:packoffset(c2);
	float4 EmissiveColor:packoffset(c3);
	float4 ToonColor:packoffset(c4);
	float4 EdgeColor:packoffset(c5);
	float4 GroundShadowColor:packoffset(c6);
	float4 AddingTexture:packoffset(c7);
	float4 MultiplyingTexture:packoffset(c8);
	float4 AddingSphereTexture:packoffset(c9);
	float4 MultiplyingSphereTexture:packoffset(c10);
	float SpecularPower:packoffset(c11);
}
変数型 上の 定義での表示 パックオフセット 説明
float4 AmbientColor c0 float4 AmbientColor:AMBIENT<string object="Geometry";>;と同一
float4 DiffuseColor c1 float4 DiffuseColor:DIFFUSE<string object="Geometry";>;と同一
float4 SpecularColor c2 float4 SpecularColor:SPECULAR<string object="Geometry";>;と同一
float4 EmissiveColor c3 float4 EmissiveColor:EMISSIVE<string object="Geometry";>;と同一
float4 ToonColor c4 float4 ToonColor:TOONCOLOR<string object="Geometry";>;と同一
float4 EdgeColor c5 float4 EdgeColor:EDGECOLOR<string object="Geometry";>;と同一
float4 GroundShadowColor c6 float4 GroundShadowColor:GROUNDSHADOWCOLOR<string object="Geometry";>;と同一
float4 AddingTexture c7 float4 AddingTexture:ADDINGTEXTURE;と同一
float4 MultiplyingTexture c8 float4 MultiplyingTexture:MULTIPLYINGTEXTURE;と同一
float4 AddingSphereTexture c9 float4 AddingSphereTexture:ADDINGSPHERETEXTURE;と同一
float4 MultiplyingSphereTexture c10 float4 MultiplyingSphereTexture:MULTIPLYINGSPHERETEXTURE;と同一
float SpecularPower c11 float SpecularPower:SPECULARPOWER<string object="Geometry";>;と同一

Last edited Apr 18, 2014 at 10:20 PM by DaikonTakuan, version 7

Comments

No comments yet.