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 .
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
の使用は、ジオメトリシェーダーを使用しない限り有効です。
以下は、サポートされるシェーダーモデルとその増強される性能 (場合によっては、より高性能のプラットフォームや GPU が必要) の一覧です。
es3.0
ターゲットが持つすべてが含まれます。(モバイルを含む) すべての OpenGL のようなプラットフォームは “シェーダーモデル 3.0 相当の能力を持つ” ものとして扱われることに注意してください。WP8/WinRT プラットフォーム(DX11 フィーチャーレベル 9.x)はシェーダーモデル 2.5 相当の能力のみを持つものとして扱われます。
以下は、#pragma require
ディレクティブのサポートされている機能名の一覧です。
interpolators10
: 最低 10 個の頂点からフラグメントへの補間 (varying) が可能です。interpolators15
: 最低 15 個の頂点からフラグメントへの補間 (varying) が可能です。interpolators32
: 最低 32 個の頂点からフラグメントへの補間 (varying) が可能です。mrt4
: 複数のレンダーターゲット、少なくとも 4mrt8
: 複数のレンダーターゲット、少なくとも 8derivatives
: ピクセルシェーダー派生命令 (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
: derivatives3.0
: 2.5 + interpolators10 + samplelod + fragcoord3.5
: 3.0 + interpolators15 + mrt4 + integers + 2darray + instancing4.0
: 3.5 + geometry5.0
: 4.0 + compute + randomwrite + tesshw + tessellation4.5
: 3.5 + compute + randomwrite4.6
: 4.0 + cubearray + tesshw + tessellationDirect3D の用語では、シェーダーモデル 4.0 は “mrt8” を意味することもあります。シェーダーモデル 5.0 は “interpolators32” と “cubearray” を意味することもあります。ただし、これらは多くのモバイルプラットフォームでそうであるとはかぎりません。したがって、既存のシェーダーとの後方互換性を保つために #pragma target 4.0 と記しても、必ずしも 8 つのレンダーターゲットを必要とするわけではありません。#pragma target 5.0 と記しても、必ずしも 32 の補間やキューブマップ配列を必要とするわけではありません。