HLSL では、#include
ディレクティブは、プリプロセッサーディレクティブ の一種です。コンパイラーに、HLSL ファイル内部にあるもう一つの HLSL ファイルのコンテンツを含むように指示します。含まれるファイルは インクルードファイル と呼ばれます。
Unity では、通常の #include
ディレクティブは、標準の HLSL と同じように動作します。通常の #include
ディレクティブの詳細については、HLSL のドキュメント [#include ディレクティブ](https://docs.microsoft.com/ja-jp/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-pre-include) を参照してください。
また、Unity は、さらに Unity 特有の #include_with_pragmas
ディレクティブを提供しています。#include_with_pragmas
ディレクティブは、通常の #include
ディレクティブと同じ働きをしますが、インクルードファイルの中で #pragma
ディレクティブを使用することもできます。つまり、 #include_with_pragmas
ディレクティブを使うと、複数のファイル間で #pragma
ディレクティブを共有することができます。
ノート: #include_with_pragmas
を使用するには、キャッシングシェーダープリプロセッサー を有効にする必要があります。
この例では、Unity 特有の #include_with_pragmas
ディレクティブを使って、一般的なワークフローの改善を行う方法を示します。それは、シェーダーのソースファイルを毎回編集することなく、複数のシェーダーに対してシェーダーデバッグのオン/オフを切り替える機能です。
次の記述は,インクルードファイルの内容を示しています。シェーダーのデバッグを可能にする pragma ディレクティブが 1 つ含まれています。
// シェーダーのデバッグを無効にするには、次の行をコメントアウトしてください。
# pragma enable_d3d11_debug_symbols
デバッグしたい各シェーダーに、インクルードファイルを指す #include_with_pragma
ディレクティブを加えます。このディレクティブは、他の #pragma
ディレクティブの近くに、以下のように記述します。
// pragma ディレクティブの例
# pragma target 4.0
# pragma vertex vert
# pragma fragment frag
// path-to-include-file をインクルードファイルへのパスに置き換えて使います
# include_with_pragmas "path-to-include-file"
// HLSL コードの残りはここへ記述
これで、このインクルードファイルを使用するすべてのシェーダーで、インクルードファイルの 1 行を変更するだけでシェーダーデバッグのオン/オフを切り替えることができます。Unity がシェーダーを再コンパイルする際に、修正した行が含まれます。