Version: Unity 6.0 (6000.0)
言語 : 日本語
シェーダーでの 16 ビット精度の使用
Unity での GLSL

HLSL でシェーダーコンパイラーに情報を渡す

HLSL では、次の種類のプリプロセッサーディレクティブを使用して、シェーダーコンパイラーに情報を提供できます。

  • #pragma
  • #define_for_platform_compiler

pragma ディレクティブ

#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_MOBILESHADER_API_DESKTOPUNITY_NO_RGBMUNITY_USE_NATIVE_HDRUNITY_FRAMEBUFFER_FETCH_AVAILABLEUNITY_NO_CUBEMAP_ARRAY
    • UNITY_VERSION マクロ
  • Unity 固有の #pragma ディレクティブは、.shader ファイル、および #include_with_pragmas ディレクティブに配置するファイルでのみ使用できます。Unity は、それらを #include ディレクティブに配置するファイルではサポートしません。コンパイラーはそれらを無視します。
  • 標準の HLSL #pragma ディレクティブは、#include ディレクティブに配置するファイルでのみ使用できます。Unity は、.shader ファイル、または #include_with_pragmas ディレクティブに配置したファイルではそれらをサポートしません。コンパイラーはそれらを無視します。

注意シェーダーファイルが #include を使用して #include_with_pragmas ディレクティブを含むファイルをインポートする場合、Unity は #include_with_pragmas ディレクティブが参照するファイル内の #pragma ディレクティブを無視します。

define_for_platform_compiler ディレクティブの使用

シェーダーコードで #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) ステートメント内に追加すると、コードは実行されません。

追加リソース

シェーダーでの 16 ビット精度の使用
Unity での GLSL