Version: Unity 6.0 (6000.0)
言語 : 日本語
パッケージを要求するシェーダーの設定
シェーダーにグラフィックス API またはプラットフォーム要件を設定する

シェーダーが必要とするシェーダーモデルまたは GPU 機能の設定

#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 はシェーダーのコンパイル時に、これらの要件を追加したことを示す警告メッセージを表示します。この警告メッセージが表示されないようにするには、明示的に要件を追加するか、コードで適切なターゲット値を使用してください。

GPU 機能かシェーダーモデルの指定

必須の機能を指定するには、#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 のキーワードを指定する場合は、コロンを使用しません。

DirectX12 (DX12)、Vulkan、Metal グラフィックス API 機能

注意以下のシェーダーキーワードを使用すると、Unity は DXC コンパイラーを使用してシェーダーをコンパイルします。Unity の DXC サポートは実験的で、すべてのプラットフォームでサポートされているわけではなく、本番環境での使用には適していません。

DirectX12 (DX12)、Vulkan、または Metal グラフィックス API を使用する場合は、シェーダーキーワードを使用して以下の GPU 機能をターゲットにできます。

以下の構文を使用します。

#pragma multi_compile _ <keyword>

pragma require ディレクティブを追加する必要はありません。

Unity は以下を行います。

  • 互換性のあるシェーダーコンパイラーを使用し、機能に関連するコンパイラーフラグをオンにします。
  • キーワードがオンのシェーダーバリアントと、キーワードがオフのシェーダーバリアントの両方を自動的にコンパイルします。
  • ランタイムに、ハードウェアがその機能をサポートするかどうかを自動的に確認し、適切なバリアントを選択します。

#if ステートメントを使用すると、GPU がその機能をサポートするかどうかをシェーダーコードの一部に条件付けすることができます。

Keywords

マルチコンパイルキーワード|GPU 機能|条件付きシェーダーコードのキーワード -|-|- UNITY_DEVICE_SUPPORTS_NATIVE_16BIT|16 ビットデータ型のサポート。このキーワードを使用すると、halfmin16float などのデータ型が 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 のシェーダーキーワードの宣言と使用 を参照してください。

追加リソース

パッケージを要求するシェーダーの設定
シェーダーにグラフィックス API またはプラットフォーム要件を設定する