、コンパイラマクロの値に応じて、通常、マクロプリプロセッサマクロ値のメカニズムを決定するために使用されるコンパイルされた言語の条件付きコンパイルをサポートし
ているコンパイルされたコードの一部判定する。
マクロと組み合わせコンパイラインジケータの#pragma multi_compileまたは#pragmaのshader_featureを使用して定義されたコマンド、ならびに素材クラスのメンバ関数EnableKeyworldエンジンC#言語の層又はシェーダクラスの静的メンバ関数EnableKeyword、有効にするかどうかを判断
もUnity3Dシェーダコンパイラサポートをこの前処理メカニズム。
各セクションは、多様体(シェーダは変異体)、#プラグマmulti_compileの#pragma shader_featureまたは表示名の文字列に続く後と呼ばれる複数の鍵本体(キーワード変異体)シェーダと呼ばれるか否かを判定する条件付きコンパイルコンパイルされたコード・セグメントによって制御されます。複数のキーワードのボディは、マクロダイバーシティの前処理と呼ばれるシェーダのソースコードの判断、(前処理マクロを変異体)のようなIFDEF#を定義します。
#pragma multi_compile差と#pragma shader_feature:
など:
の#pragma multi_compile FANCY_STUFF_OFF FANCY_STUFF_ON
二つの文は、複数のシェーダ体が生成され、一方はFANCY_STUFF_OFF、他方はFANCY_STUFF_ONで有効になっています。
C#言語レベルではなく、多様な身体のキーワードが明示的に有効になっている場合は、メンバ関数EnableKeywordマテリアルクラスは、シェーダー多様体のアクティブ1に示すことができます呼び出します。だから、最初の1は、デフォルトの多様な身体で有効になっています。#pragma multi_compileも様々な団体に二つ以上のキーワードを定義することができます。
:複数の鍵本体を使用する場合など、マクロ「_」は、まだコンパイルされて、対応する複数からなるが、該当する事前定義されていない完全にアンダースコア
の#pragma multi_compile FOO_ONは
シェーダコードに使用することができません定義された(そのようなAコードを判断する)ステートメントが開いています。
しかし、「__」様々なシェーダ言及に対応する識別し、コンパイルされます。例えば:
float4 FooFunction()
{
#ifdef FOO_ON
return float4(1,0,0,1);
#else
return float4(1,1,0,1);
#endif
}
FOO_ONを有効にするには、noコールEnableKeyword機能がない場合、その後の#elseと#endifの、戻りのfloat4(1,1,0,1)間のコードセグメントを実行するFooFunction関数を呼び出します。
多様な身体のキーワードの定義を使用するには、この匿名の方法は、その利点が限られているため、シェーダコンパイラ多様体定義されているキーワードの数の、多様な身体のキーワードの数を保存することができます。
プラグマshader_feature multi_compileの#pragmaに似た
、唯一の違いは、パッケージを構築するゲーム(ゲームビルド)を実行したときshader_featureインジケータが使用中のシェーダ多様体で宣言されていない場合、それはそれにパッケージ化されることはありません、です。あなたがセットにマテリアルクラスのメンバ関数を呼び出されたオブジェクトの材料に設定したいのであれば、多様な身体のキーワード、最良の指標のshader_feature文をEnableKeyword。あなたがグローバルスコープは、#pragma multi_compile最良の指標文でEnableKeywordを設定するために、つまりシェーダクラスの静的メソッドの呼び出しで設定したい場合は、キーワードの多様なボディ。