ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

【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

参考

docs.unity3d.com

docs.unity3d.com

light11.hatenadiary.com