Version: 2020.3
言語: 日本語
HLSL のプリプロセッサーディレクティブ
HLSL のプラグマディレクティブ

HLSL の include と include_with_pragmas ディレクティブ

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 ディレクティブの使用

ノート: #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 がシェーダーを再コンパイルする際に、修正した行が含まれます。

HLSL のプリプロセッサーディレクティブ
HLSL のプラグマディレクティブ