Version: 2021.1
言語: 日本語
Shader compilation: pragma directives
Shader compilation: targeting graphics APIs

Shader compilation: targeting shader models and GPU features

In HLSL, shader models are a way of describing the capabilities of a GPU. You can tell Unity to compile shaders for GPUs with certain capabilities, either by specifying the shader model that the GPU must support, or by specifying individual features that the GPU must support.

For general information on shader models in HLSL, see the Microsoft documentation: Shader Models vs Shader Profiles .

Specifying a shader model or GPU feature

To specify a shader model or GPU feature that your Shader object requires, you use pragma directives in your HLSL code. You can indicate the shader model by using the #pragma target name directive, and you can indicate features using the #pragma require feature … directive.

例:

# pragma target 3.5
# pragma require integers 2darray instancing

For more information on pragma directives, see HLSL pragma directives.

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

デフォルトでは、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で追加
Shader compilation: pragma directives
Shader compilation: targeting graphics APIs