Version: 2018.4
言語: 日本語
Unityで使用するシェーダー言語
シェーダーのデータ型と精度

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

サーフェスシェーダー か通常の シェーダープログラム を使用すると、HLSL ソースはさまざまなシェーダーモデルにコンパイルされます。より新しい GPU 機能を使用するには、より高いレベルのシェーダーコンパイルターゲットを使用する必要があります。

ノート: より高いレベルのシェーダーコンパイルターゲットを使用すると、古い GPU やプラットフォームでシェーダーが動作しなくなる場合があります。

以下の例のように、#pragma target 名前 のディレクティブか、より具体的な #pragma require 機能 のディレクティブを使用してコンパイルターゲットを指定します。

# pragma target 3.5
# pragma require integers 2darray instancing

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

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

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

ジオメトリシェーダー、ハルシェーダー、ドメインシェーダーの #pragma を通して関数のエントリーポイントを明示的に設定しないシェーダーはすべて、内部シェーダーの機能要件をダウングレードします。これにより、ランタイムと機能の違いがより大きい DX11 以外のターゲットに既存のシェーダーコンテンツと互換性を持たせることができます。

例えば、Unity は Metal グラフィックスのテッセレーションシェーダーをサポートしますが、Metal はジオメトリシェーダーをサポートしません。#pragma target 5.0 の使用は、ジオメトリシェーダーを使用しない限り有効です。

サポートされている ‘pragma target’ 名前

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

#pragma target 2.0

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

#pragma target 2.5 (デフォルト)

  • 3.0 ターゲットとほとんど同じ (後述を参照) ですが、interpolator が 8 個しかない点、明白な LOD テクスチャサンプリングがない点が異なります。
  • 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、ジオメトリシェーダーのみ含まれない)
  • 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
  • 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、テッセレーションシェーダーのみ含まれない)
  • SM5.0 より前の DX11 、4.3 より前の OpenGL (つまり Mac) 、OpenGL ES 2.0/3.0 はサポートされません。
  • DX11 以降の SM5.0、OpenGL 4.3 以降の OpenGL ES 3.1、Metal、Vulkan、PS4/XB1 コンソールでサポートされます。
  • コンピュートシェーダー、ランダムアクセステクスチャ書き込み、アトミックなどが含まれます。ジオメトリシェーダーやテッセレーションシェーダーは含まれません。

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

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

#pragma target 5.0

  • DX11 シェーダーモデル 5.0.
  • 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、Metal (ジオメトリなし)、PS4/XB1 コンソールでサポートされます。

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

サポートされている ‘#pragma require’ 機能

以下は、#pragma require ディレクティブのサポートされている機能名の一覧です。

  • interpolators10: 最低 10 個の頂点からフラグメントへの補間 (varying) が可能です。
  • interpolators15: 最低 15 個の頂点からフラグメントへの補間 (varying) が可能です。
  • interpolators32: 最低 32 個の頂点からフラグメントへの補間 (varying) が可能です。
  • mrt4: 複数のレンダーターゲット、少なくとも 4
  • mrt8: 複数のレンダーターゲット、少なくとも 8
  • derivatives: ピクセルシェーダー派生命令 (ddx/ddy)
  • samplelod: 明示テクスチャ LOD サンプリング (tex2Dlod/SampleLevel)
  • fragcoord: ピクセルシェーダーのピクセル位置 (画面の XY、クリップスペースの ZW 深度) の入力
  • integers: 整数は、ビット/シフト演算を含む実際のデータ型です。
  • 2darray: 2D テクスチャ配列 (Texture2DArray)
  • cubearray: キューブマップ配列 (CubemapArray)。
  • instancing: SV_InstanceID 入力システム値
  • geometry: DX10 ジオメトリシェーダー
  • compute: コンピュートシェーダー、構造化バッファ、アトミック演算
  • randomwrite: “ランダム書き込み” (UAV) テクスチャ
  • tesshw: ハードウェアテッセレーションの GPU サポート。ただし、必ずしもテッセレーションシェーダーステージをサポートしません (例えば、Metal はテッセレーションをサポートしますが、シェーダーステージ経由ではサポートしません)。
  • tessellation: テッセレーションのハルシェーダー/ドメインシェーダーステージ
  • msaatex: マルチサンプリングされたテクスチャにアクセスする能力 (HLSL の Texture2DMS)
  • sparsetex: 常駐情報を持つスパーステクスチャ (D3D 用語の “Tier2” サポート、CheckAccessFullyMapped HLSL 関数)。現在、これは DX11/12 でのみ実装されています。
  • framebufferfetch: フレームバッファフェッチ – ピクセルシェーダーで入力ピクセルカラーを読み取る機能。

一般に言う #pragma target ディレクティブは上の要件を簡略にしたものであり、以下に対応します。

  • 2.5: derivatives
  • 3.0: 2.5 + interpolators10 + samplelod + fragcoord
  • 3.5: 3.0 + interpolators15 + mrt4 + integers + 2darray + instancing
  • 4.0: 3.5 + geometry
  • 5.0: 4.0 + compute + randomwrite + tesshw + tessellation
  • 4.5: 3.5 + compute + randomwrite
  • 4.6: 4.0 + cubearray + tesshw + tessellation

Direct3D の用語では、シェーダーモデル 4.0 は “mrt8” を意味することもあります。シェーダーモデル 5.0 は “interpolators32” と “cubearray” を意味することもあります。ただし、これらは多くのモバイルプラットフォームでそうであるとはかぎりません。したがって、既存のシェーダーとの後方互換性を保つために #pragma target 4.0 と記しても、必ずしも 8 つのレンダーターゲットを必要とするわけではありません。#pragma target 5.0 と記しても、必ずしも 32 の補間やキューブマップ配列を必要とするわけではありません。

参照


  • 2018–03–20 編集レビュー を行って修正されたページ
  • シェーダー#pragmaディレクティブはUnity 2018.1で追加 NewIn20181
  • Tessellation for Metal は2018.1で追加
Unityで使用するシェーダー言語
シェーダーのデータ型と精度