ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

インクルードガード

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で弾いてくれます。

参考

captain-cocco.com