Version: 2021.1
言語: 日本語
Unity での HLSL
Shader compilation: targeting shader models and GPU features

Shader compilation: pragma directives

In HLSL, you can use preprocessor directives to tell the compiler how to compile a shader program. Pragma directives are a type of preprocessor directive. This page contains information about pragma directives that you can use in your shader source code.

For general information on preprocessor directives in HLSL, see the Microsoft documentation: Preprocessor directives (HLSL).

pragma ディレクティブの使用

Put pragma directives inside an HLSL code block, in your shader source file.

By default, Unity does not support pragma directives in include files. If you enable the Caching Preprocessor in your Editor Settings, you can use the #include_with_pragmas preprocessor directive. This directive lets you put pragma directives in include files. This can be especially useful for enabling or disabling shader debug symbols for multiple files.

Supported pragma directives

シェーダーステージ

Use these pragma directives to tell the compiler which parts of your shader code to compile as different shader stages.

An HLSL snippet must contain at least a vertex program and a fragment program, so #pragma vertex and #pragma fragment directives are required.

ステートメント 機能
#pragma vertex name 頂点 シェーダーとして関数 name をコンパイルします。
#pragma fragment name フラグメントシェーダーとして関数 name をコンパイルします。
#pragma geometry name 関数 name をDX10 ジオメトリシェーダーとしてコンパイルします。以下の表で説明するように、このオプションは自動的に #pragma target 4.0 をオンにします。
#pragma hull name 関数 name をDX11 hull シェーダーとしてコンパイルします。以下の表に示すように、このオプションは自動的に #pragma target 5.0 オンにします。
#pragma domain name 関数 name をDX11 domain シェーダーとしてコンパイルします。以下の表に示すように、このオプションは自動的に #pragma target 5.0 オンにします。

Shader variants and keywords

Use these pragma directives to tell the shader compiler how to handle shader variants and keywords.

ステートメント 機能
#pragma multi_compile ... Create shader variants for a given keyword. Unused variants of multi_compile shaders are included in the game build. For more information, see Shader variants and keywords.
#pragma multi_compile_local ... This statement is similar to multi_compile, but enumerated keywords are local. For more information, see Shader variants and keywords.
#pragma shader_feature ... Create shader variants for a given keyword. Unused variants of shader_feature shaders are not included in the game build. For more information, see Shader variants and keywords.
#pragma shader_feature_local ... This statement is similar to shader_feature, but enumerated keywords are local. For more information, see Shader variants and keywords.

Shader model and GPU features

Use these pragma directives to tell the compiler that your shader targets a specific shader model, or requires specific GPU features.

ステートメント 機能
#pragma target name Which shader model to compile this shader program for. For more information, see Shader compilation: targeting shader models and GPU features.
#pragma require feature ... Which GPU features the shader program needs. For more information, see Shader compilation: targeting shader models and GPU features.

グラフィックス API

Use these pragma directives to tell the compiler to compile your shader for specific graphics APIs.

ステートメント 機能
#pragma only_renderers space separated names Compile this shader program only for given graphics APIs. For more information, see Shader compilation: targeting graphics APIs.
#pragma exclude_renderers space separated names Do not compile this shader program for given graphics APIs. For more information, see Shader compilation: targeting graphics APIs.

その他の pragma ディレクティブ

ステートメント 機能
#pragma enable_d3d11_debug_symbols Generates shader debug symbols and/or disables optimizations. Use this for debugging shader code in an external tool.

For Vulkan, DirectX 11 and 12, and supported console platforms, Unity generates debug symbols and disables optimizations.

For Metal and OpenGL, you can already debug shaders by default. When you use this pragma directive, Unity disables optimizations.

Warning: Using this directive results in an increased file size and reduced shader performance. When you have finished debugging your shaders and you are ready to make a final build of your application, remove this line from your shader source code and recompile the shaders.
#pragma hardware_tier_variants renderer name Generate multiple shader hardware variants of each shader the system compiles for each hardware tier that can run the selected renderer.
This statement is only supported in the Built-in Render Pipeline.
#pragma hlslcc_bytecode_disassembly 逆アセンブルされた HLSLcc バイトコードを変換したシェーダーに埋め込みます。
#pragma disable_fastmath NaN 処理を含む正確な IEEE 754 規則を有効にします。現在、これは Metal プラットフォームにのみ影響します。
#pragma glsl_es2 GLSL シェーダーで設定すると、 シェーダー ターゲットが OpenGL ES 3 の場合でも、GLSL ES 1.0 (OpenGL ES 2.0) を生成します。
#pragma editor_sync_compilation 同期コンパイルを強制します。これは Unity エディターにのみ影響します。詳細については、非同期シェーダーコンパイル を参照してください。
#pragma enable_cbuffer 現在のプラットフォームが定数バッファをサポートしていない場合でも、HLSLSupport から CBUFFER_START(name)CBUFFER_END マクロを使用する場合に cbuffer(name) を放出します。

Unused pragma directives

以下のコンパイルディレクティブは何もせず、安全に削除できます。

  • #pragma glsl
  • #pragma glsl_no_auto_normalization
  • #pragma profileoption
  • #pragma fragmentoption
Unity での HLSL
Shader compilation: targeting shader models and GPU features