#pragma ディレクティブ を使って、シェーダーが特定の GPU 機能を必要とすることを示します。Unity はランタイムに、この情報を使ってシェーダープログラムが使用中のハードウェアと互換性があるかどうかを判断します。
#pragma require ディレクティブで GPU 機能を個別に指定するか、#pragma target ディレクティブで シェーダーモデル を指定できます。シェーダーモデルは、複数の GPU 機能を 1 つにまとめた省略表現であり、内部的には同じ機能リストを持つ #pragma require ディレクティブと変わりません。
シェーダーが必要とする GPU 機能を正しく記述することが重要です。シェーダーが要件リストに含まれていない機能を使用する場合、 コンパイル時にエラーが発生したり、デバイスがランタイムにシェーダーをサポートできなくなったりする可能性があります。
デフォルトでは、Unity はシェーダーを #pragma target 2.5 に対応する #pragma require derivatives でコンパイルします。
シェーダーが特定のシェーダーステージを定義する場合、Unity は自動的に要件リストに項目を追加します。
#pragma geometryによって) ジオメトリステージを定義する場合、Unity は自動的に geometry を要件リストに追加します。#pragma hull または #pragma domainによって) テッセレーションステージを定義する場合、Unity は自動的に tessellation を要件リストに追加します。要件のリスト (または同等のターゲット値) にこれらの値がまだ含まれていない場合、Unity はシェーダーのコンパイル時に、これらの要件を追加したことを示す警告メッセージを表示します。この警告メッセージが表示されないようにするには、明示的に要件を追加するか、コードで適切なターゲット値を使用してください。
必須の機能を指定するには、#pragma require ディレクティブの後に、スペースで区切られた値のリストを使用します。
例:
#pragma require integers mrt8
#pragma require ディレクティブの後に、コロンとスペースで区切られた シェーダーキーワード のリストを表記して使用することもできます。これは、指定されたキーワードのいずれかが有効になっているときに使用されるバリアントにのみ要件が適用されることを意味します。
例:
#pragma require integers mrt8 : EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
複数の #pragma require を使用できます。この例では、シェーダーはすべての場合に integers を要求し、EXAMPLE_KEYWORD が有効な場合には mrt8 を要求します。
#pragma require integers
#pragma require integers mrt8 : EXAMPLE_KEYWORD
シェーダーモデルを指定するには、#pragma target ディレクティブを使用します。
例:
#pragma target 4.0
#pragma target ディレクティブの後に、スペースで区切られた シェーダーキーワード のリストを表記して使用することもできます。これは、指定されたキーワードのいずれかが有効になっているときに使用されるバリアントにのみ要件が適用されることを意味します。
例:
#pragma target 4.0 EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
注意#pragma require と #pragma target のキーワードを指定する構文は若干異なります。#pragma require のキーワードを指定する場合は、コロンを使用します。#pragma target のキーワードを指定する場合は、コロンを使用しません。
注意以下のシェーダーキーワードを使用すると、Unity は DXC コンパイラーを使用してシェーダーをコンパイルします。Unity の DXC サポートは実験的で、すべてのプラットフォームでサポートされているわけではなく、本番環境での使用には適していません。
DirectX12 (DX12)、Vulkan、または Metal グラフィックス API を使用する場合は、シェーダーキーワードを使用して以下の GPU 機能をターゲットにできます。
以下の構文を使用します。
#pragma multi_compile _ <keyword>
pragma require ディレクティブを追加する必要はありません。
Unity は以下を行います。
#if ステートメントを使用すると、GPU がその機能をサポートするかどうかをシェーダーコードの一部に条件付けすることができます。
マルチコンパイルキーワード|GPU 機能|条件付きシェーダーコードのキーワード -|-|- UNITY_DEVICE_SUPPORTS_NATIVE_16BIT|16 ビットデータ型のサポート。このキーワードを使用すると、half や min16float などのデータ型が 16 ビットに変換されるため、シェーダーバッファのレイアウトが変更される可能性があります。 |UNITY_DEVICE_SUPPORTS_NATIVE_16BIT UNITY_DEVICE_SUPPORTS_WAVE_ANY|あらゆるサイズの Wave 処理をサポートします。このキーワードは、Wave のサイズが重要でない Wave 処理にのみ使用してください。|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_8|Wave のサイズが 8 の Wave 処理をサポートします。|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_16|Wave のサイズが 16 の Wave 処理 をサポートします。|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_32|Wave のサイズが 32 の Wave 処理をサポートします。|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_64|Wave のサイズが 64 の Wave 処理をサポートします。|UNITY_HW_SUPPORTS_WAVE UNITY_DEVICE_SUPPORTS_WAVE_128|Wave のサイズが 128 の Wave 処理をサポートします。|UNITY_HW_SUPPORTS_WAVE
特定の Wave のサイズをターゲットにするキーワードを使用すると、Unity は UNITY_HW_WAVE_SIZE 定義を同じ Wave のサイズに設定し、シェーダーコードで使用できるようにします。
詳細は、HLSL のシェーダーキーワードの宣言と使用 を参照してください。