HLSL では、次の種類のプリプロセッサーディレクティブを使用して、シェーダーコンパイラーに情報を提供できます。
#pragma#define_for_platform_compiler
#pragma ディレクティブは、他のタイプのプリプロセッサーディレクティブではカバーされていない追加情報をシェーダーコンパイラーに提供します。
#pragma ディレクティブは HLSL コードの任意の場所に配置できますが、以下のように先頭に配置するのが一般的です。
#pragma target 3.0
#pragma exclude_renderers vulkan
#pragma vertex vert
#pragma fragment frag
// The rest of your HLSL code goes here
#pragma ディレクティブの使用にはいくつかの制限があります。
#pragma ディレクティブを条件付き (#if) ディレクティブ内で使用することができます。
#define ディレクティブSHADER_API_MOBILE、SHADER_API_DESKTOP、UNITY_NO_RGBM、UNITY_USE_NATIVE_HDR、UNITY_FRAMEBUFFER_FETCH_AVAILABLE、UNITY_NO_CUBEMAP_ARRAY
UNITY_VERSION マクロ#pragma ディレクティブは、.shader ファイル、および #include_with_pragmas ディレクティブに配置するファイルでのみ使用できます。Unity は、それらを #include ディレクティブに配置するファイルではサポートしません。コンパイラーはそれらを無視します。#pragma ディレクティブは、#include ディレクティブに配置するファイルでのみ使用できます。Unity は、.shader ファイル、または #include_with_pragmas ディレクティブに配置したファイルではそれらをサポートしません。コンパイラーはそれらを無視します。
注意シェーダーファイルが #include を使用して #include_with_pragmas ディレクティブを含むファイルをインポートする場合、Unity は #include_with_pragmas ディレクティブが参照するファイル内の #pragma ディレクティブを無視します。
シェーダーコードで #define_for_platform_compiler ディレクティブを使用して、シェーダーコンパイラーに #define ディレクティブを送信します。
例えば、#define_for_platform_compiler EXAMPLE_SYMBOL はシェーダーコンパイラーに、EXAMPLE_SYMBOL と呼ばれるシンボルを定義する #define EXAMPLE_SYMBOL ディレクティブを送信します。シェーダーコンパイラーが使用するシンボルの詳細については、外部のシェーダーコンパイラーのドキュメント (例: Microsoft の FXC コンパイラーに関するドキュメント) を参照してください。
#define_for_platform_compiler で定義したシンボルが Unity プリプロセッサーによって使用されないため、独自のシェーダーコードでシンボルを使用することはできません。例えば、上の例では、シェーダーコードを #if (EXAMPLE_SYMBOL) ステートメント内に追加すると、コードは実行されません。