【Unity】シェーダーモデルとは
シェーダーモデル(Shader Model)とは?
GPUによって、サポートされているシェーダーの機能は異なります。
サポートされていない機能をコンパイル時にエラーが発生したり、デバイスが実行時にシェーダーをサポートできなくなる可能性があります。
これはグラフィックスAPIの違いや同じグラフィックスAPIでも、世代によって使用できる機能が異なるからです。
この世代のことをシェーダーモデルと言います。
シェーダーモデルが高いほど、使用できる機能が多く、低いと使用できる機能も少なくなります。
シェーダーモデルの指定
Unityでも、# pragma target
ディレクティブで、シェーダーモデルを指定します。
シェーダーが要件リストに含まれていない機能を使用すると、 コンパイル時にエラーが発生したり、デバイスが実行時にシェーダーをサポートできなくなる可能性があります。
シェーダーモデル3.0を指定する場合は以下のように宣言します。
# pragma target 3.0
※デフォルトは# pragma target 2.5です。
また、特定のバリアントが有効な時に機能を有効にしたい場合は、pragma target
の後ろにシェーダーキーワードを指定します。
# pragma target 3.0 EXAMPLE_KEYWORD OTHER_EXAMPLE_KEYWORD
シェーダーモデル | 説明 | サポート |
---|---|---|
2.0 | DirectX シェーダーモデル 2.0 に相当。 ・Interpolator 8 個 ・頂点テクスチャサンプリング無し ・ddx,ddy無し ・明示的LODテクスチャサンプリング無し |
Unity がサポートするすべてのプラットフォームで動作します。 |
2.5 | ・Interpolator 8 個 ・明示的な LOD テクスチャサンプリング無し ・ddx,ddy対応 |
DirectX 11 機能レベル 9 以降 OpenGL 3.2+ OpenGL ES 2.0 Vulkan Metal |
3.0 | DirectX シェーダーモデル 3.0 に相当。 ・interpolators10 個 ・テクスチャLOD サンプリング (tex2Dlod / SampleLevel) サポート ・ピクセルシェーダーのピクセル位置 (VPOSセマンティクス) の入力対応 |
DirectX 11 機能レベル 10 以降 OpenGL 3.2 以降 OpenGL ES 3.0 以降 Vulkan Metal ドライバーの拡張や機能によっては、一部の OpenGL ES 2.0 デバイスで動作する可能性があります。 |
3.5 | OpenGL ES 3.1 に相当。 ・interpolators15 個 ・最低でも 4 つのレンダーターゲット対応 ・整数は、ビット/シフト演算を含めてサポートされているデータ型です。 ・2D テクスチャ配列 ・インスタンシング(SV_InstanceID の入力システムの値をサポート) |
DirectX 11 機能レベル 10 以降 OpenGL 3.2 以降 OpenGL ES 3 以降 Vulkan Metal |
4.0 | DirectX shader model 4.0 に相当します。 3.5に加え以下の機能 ・ジオメトリーシェーダー対応 |
DirectX 11 機能レベル 10 以降 OpenGL ES 3.1+AEP Vulkan Metal (ジオメトリステージが定義されていない場合) |
4.5 | OpenGL ES 3.1 に相当。 3.5に加え以下の機能 ・コンピュートシェーダー、構造体バッファ、アトミックオペレーション対応 ・Random write(UAV) テクスチャ対応 ・マルチサンプリングされたテクスチャにアクセスする機能 (HLSL の Texture2DMS) 対応 |
DirectX 11 機能レベル 11 以降 OpenGL 4.3 以降 OpenGL ES 3.1 Vulkan Metal |
4.6 | OpenGL 4.1 に相当。 4.0に加え以下の機能 Mac でサポートされている OpenGL の最高レベルです。 ・キューブマップ配列対応 ・テッセレーション対応 必ずしもテッセレーション (ハル/ドメイン) に対応している訳ではありません。例えば、Metal はテッセレーションをサポートしていますが、ハルやドメインのステージは対応していません。 ・テッセレーション (ハル/ドメイン) シェーダー対応 ・マルチサンプリングされたテクスチャにアクセスする機能 (HLSL の Texture2DMS) 対応 |
DirectX 11 機能レベル 11 以降 OpenGL 4.1 以降 OpenGL ES 3.1+AEP Vulkan Metal (ジオメトリステージが定義されておらず、且つ、ハルまたはドメインステージが定義されていない場合)。 |
5.0 | DirectX shader model 5.0 に相当。 4.0に加え以下の機能 ・コンピュートシェーダー、構造体バッファ、アトミックオペレーション対応 ・Random write(UAV) テクスチャ対応 |
DirectX 11 機能レベル 11 以降 OpenGL 4.3 以降 OpenGL ES 3.1+AEP Vulkan Metal (ジオメトリステージが定義されておらず、且つ、ハルまたはドメインステージが定義されていない場合)。 |
※ Interpolator 頂点シェーダーからフラグメントシェーダーに渡すパラメータ
GPU機能の指定
シェーダーモデルを指定するとそのシェーダーモデルに対応した機能がいくつか使用できるようになっていましたが、機能ごとで機能を指定することができます。
mrt8
という最低でも 8 つのレンダーターゲットに対応するという機能を指定する場合、以下のように宣言します。
# pragma require mrt8
また、特定のバリアントが有効な時に機能を有効にしたい場合は、pragma require
の後ろに :
を付けて、後ろにシェーダーキーワードを指定します。
# pragma require mrt8 : EXAMPLE_KEYWORD
そのほかの機能については公式リファレンスの#pragma require値のリストをご参照ください。 docs.unity3d.com