Version: 2017.1
Unityで使用するシェーダー言語
シェーダーのデータタイプと精度

シェーダーコンパイルターゲットレベル

サーフェスシェーダー または、通常の シェーダープログラム を作成する場合、HLSL ソースは異なる「シェーダーモデル」にコンパイルされます。シェーダーコンパイルターゲットをより高いレベルにすると、より最新の GPU 機能を利用できますが、一方、古い GPU やプラットフォームでそのシェーダーを使用できない可能性もあります。

コンパイルターゲットは、#pragma target 名前ディレクティブで示されます。例えば、以下のとおりです。

# pragma target 3.5

デフォルトコンパイルターゲット

デフォルトでは、Unity はシェーダーをほとんど最低レベルの適応ターゲット (2.5) にコンパイルします。これは、だいたい DirectX シェーダーモデル 2.0 と 3.0 の間と同等です。他のコンパイラーディレクティブには、シェーダーを自動的により高いターゲットにコンパイルするものもあります。

  • ジオメトリシェーダー (#pragma geometry) を使用すると、コンパイルターゲットを 4.0 に設定します。
  • テッセレーションシェーダー (#pragma hull または #pragma domain) を使用すると、コンパイルターゲットを 4.6 に設定します。

適用される #pragma ターゲット名

以下は、サポートされるシェーダーモデルとその増強される性能 (場合によっては、より高性能のプラットフォームや GPU が必要) の一覧です。

#pragma target 2.0

  • Unity でサポートされるすべてのプラットフォームに使用できます。DX9 シェーダーモデル 2.0
  • 制限された計算とテクスチャの指示。interpolator 8個、頂点テクスチャサンプリング 無し、フラグメントシェーダーのデリバティブ 無し、明示的 LOD テクスチャサンプリング 無し。

#pragma target 2.5 (デフォルト)

  • 3.0 ターゲットとほとんど同じ (後述を参照) ですが、interpolator が 8 個しかない点、明白な LOD テクスチャサンプリングがない点が異なります。
  • DX9 で SM3.0 に、Windows Phone で DX11 フィーチャーレベル 9.3 にコンパイル

#pragma target 3.0

  • DX9 シェーダーモデル 3.0。デリバティブ指示、テクスチャ LOD サンプリング、interpolator 10個、より多くの計算とテクスチャの指示が可能です。
  • DX11 フィーチャーレベル 9.x GPU (ほとんどの Windows Phone デバイス) ではサポート無し
  • OpenGL ES 2.0 デバイスのなかには、使用されるドライバ拡張と機能によって完全にはサポートしないものがあります。

#pragma target 3.5 (または es3.0)

  • OpenGL ES 3.0 機能 (D3D プラットフォームの DX10 SM4.0、ジオメトリシェーダーのみ含まれない)
  • DX9、DX11 9.x (WinPhone)、OpenGL ES 2.0 ではサポートされません。
  • DX11 以降、OpenGL 3.2 以降、OpenGL ES 3 以降、Metal、Vulkan,、PS4/XB1 コンソールでサポートされます。
  • シェーダー、テクスチャ配列などのネイティブ整数オペレーション

#pragma target 4.0

  • DX11 シェーダーモデル 4.0
  • DX9、DX11 9.x (WinPhone)、OpenGL ES 2.0/3.0/3.1、Metal ではサポートされません。
  • DX11 以降、OpenGL 3.2 以降、OpenGL ES 3.1 以降のAEP、Vulkan, PS4/XB1 コンソールでサポートされます。
  • ジオメトリシェーダーと es3.0 ターゲットが持つすべてが含まれます。

#pragma target 4.5 (または es3.1)

  • OpenGL ES 3.1 機能 (D3D プラットフォームの DX11 SM5.0、テッセレーションシェーダーのみ含まれない)
  • Not supported on DX9, DX11 before SM5.0, OpenGL before 4.3 (i.e. Mac), OpenGL ES 2.0/3.0.
  • DX11 以降の SM5.0、OpenGL 4.3 以降の OpenGL ES 3.1、Metal、Vulkan、PS4/XB1 コンソールでサポートされます。
  • コンピュートシェーダー、ランダムアクセステクスチャ書き込み、atomics などが含まれます。ジオメトリシェーダーとテッセレーションシェーダーは含まれません。

#pragma target 4.6 (または gl4.1)

  • OpenGL 4.1 機能 (D3D プラットフォームの DX11 SM5.0、コンピュートシェーダーのみ含まれない)。基本的には、これが最高レベル。 Mac にサポートされる OpenGL レベル
  • SM5.0 より前の DX9 と DX11、4.1 より前の OpenGL、OpenGL ES 2.0/3.0/3.1、Metal ではサポートされません。
  • DX11+ SM5.0、OpenGL 4.1+、OpenGL ES 3.1+AEP、PS4/XB1 コンソールでサポートされます。

#pragma target 5.0

  • DX11 シェーダーモデル 5.0.
  • DX9、SM5.0 より前の DX11、4.3 より前の OpenGL (Mac)、OpenGL ES 2.0/3.0/3.1、Metal ではサポートされません。
  • DX11 以降の SM5.0、OpenGL 4.3 以降、OpenGL ES 3.1 以降の AEP、Vulkan、PS4/XB1 コンソールでサポートされます。

(モバイルを含む) すべての OpenGL のようなプラットフォームは “シェーダーモデル 3.0 相当の能力を持つ” ものとして扱われることに注意してください。WP8/WinRT プラットフォーム(DX11 フィーチャーレベル 9.x)はシェーダーモデル 2.5 相当の能力のみを持つものとして扱われます。

参照

Unityで使用するシェーダー言語
シェーダーのデータタイプと精度