サーフェスシェーダー か通常の シェーダープログラム を使用すると、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
の使用は、ジオメトリシェーダーを使用しない限り有効です。
以下は、サポートされるシェーダーモデルとその増強される性能 (場合によっては、より高性能のプラットフォームや 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 の補間やキューブマップ配列を必要とするわけではありません。