インクルードガード
URPのLitShaderを眺めているとLitFowardPass.hlslに 謎のディレクティブがあったので、調べてみました。
// LitFowardPass.hlsl #ifndef UNIVERSAL_FORWARD_LIT_PASS_INCLUDED #define UNIVERSAL_FORWARD_LIT_PASS_INCLUDED ・ ・ ・ #endif
どうやらこれはインクルードガードという2重インクルードを防ぐためのものみたいです。 2重インクルードは以下のような時に発生します。
// Hoge1.hlsl struct Hoge { }
// Hoge2.hlsl #include Hoge1.hlsl Hoge _hoge1;
// Hoge3.hlsl #include Hoge1.hlsl Hoge _hoge2;
// Main.hlsl #include Hoge2.hlsl #include Hoge3.hlsl // ここでエラー
Hoge1.hlslが2回インクルードされ、型の再定義が発生してしまいます。
これを防ぐためのインクルードガードです。
// LitFowardPass.hlsl #ifndef UNIVERSAL_FORWARD_LIT_PASS_INCLUDED #define UNIVERSAL_FORWARD_LIT_PASS_INCLUDED ・ ・ ・ #endif
#ifndefから#endifの処理はUNIVERSAL_FORWARD_LIT_PASS_INCLUDEDが定義されていない場合に読み込まれます。 一度、LitFowardPass.hlslがインクルードされた時に#defineにより、#define UNIVERSAL_FORWARD_LIT_PASS_INCLUDEDが定義されるため、次にLitFowardPass.hlslがインクルードされても、#ifndefで弾いてくれます。