#define定数

概要

HLSLでは、マクロが定義できます。これを利用することで、1つのHLSLシェーダーをMMEやMMMのシェーダーとして利用するとともにMMFのみの機能を利用したものにすることが可能です。
この章ではMMFで利用できる#define定数の種類とその使用例について見ていきます。

#define定数の種類

定数名 役割 固定or可変
MMF なし MMFを用いてレンダリングされるときはこの定数が定義される。 固定
MMM_LightCount 3 MMMにおいてのライトの最大数、MMMとのシェーダーの互換性のために定義されている。 固定
(アプリケーション固有の定数) なし MMFを利用するアプリケーションがマクロを設定することを考え、MMF.CG.MMEEffect.MMEEffectManager.ApplicationDefinitionに指定した文字列が定義される。 可変
DX_LEVEL_10_1/DX_LEVEL_11_0 なし MMFがどちらのデバイスを用いて初期化されたかを指します。それぞれ、DirectX10.1(シェーダーモデル4.1)、DirectX11(シェーダーモデル5.0)を指します。 可変

使用例

テセレーションの使用/不使用を切り替える

例えば、テクニックの定義部分を以下のようにすることで、DirectX11で初期化された際にのみシェーダーモデル5.0である必要があるハルシェーダを利用するように記述することができます。(多くの場合、ドメインシェーダーも同様に必要になります。)
technique10 TestTechnique<string MMDPass="object";>
{
	pass Textured
	{		
		SetVertexShader(CompileShader(vs_4_0, VS0_main()));
		SetPixelShader(CompileShader(ps_4_0, PS_Textured()));
#ifdef DX_LEVEL_11_0
		SetHullShader(CompileShader(hs_5_0,HS_main()));
#endif
	}
}

定数バッファの使用/不使用を切り替える

定数バッファの詳細については定数バッファを参照してください。
MMFでは、最低のシェーダーモデルが4.1となるため、DirectX11とDirectX10.1のどちらで初期化されていても、定数バッファが使用できることになります。そのため、マテリアルの情報を以下のように記述することで、MMFの場合の定数の受け渡しを多少高速化することが可能です。
#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

Last edited Jan 12, 2014 at 2:32 AM by LimeStreem, version 3

Comments

No comments yet.