ビルトインレンダーパイプラインでは、グラフィックスティア を使用して、アプリケーションを異なる性能のハードウェアで実行する場合に、さまざまなグラフィックス設定を適用することができます。Unity のビルトインの ティア設定 を使って一般的な設定を行ったり、独自のシェーダーコードや C# コードでカスタムの動作を定義することもできます。
ノート: この機能は、ビルトインレンダーパイプラインでのみサポートされています。他のレンダーパイプラインでは、Unity は起動時にハードウェアをチェックし、その値を Graphics.activeTier に保存します。ただし、このフィールドの値は何の効力もなく、Unity はグラフィックスティアに関連する他の操作を行いません。
Unity が最初にアプリケーションをロードするとき、ハードウェアとグラフィックス API を調査し、現在の環境がどのグラフィックスティアに対応しているかを判断します。
グラフィックスティアは以下の通り。
Value | Hardware | Corresponding GraphicsTier enum value | Corresponding shader keyword |
---|---|---|---|
1 | Android: devices that only support OpenGL ES 2 iOS: iPhones before iPhone 5S (not including 5S, but including 5C), iPods up to and including 5th generation, iPads up to 4th generation, iPad mini first generation Desktop: DirectX 9 XR: HoloLens |
Tier1 | UNITY_HARDWARE_TIER1 |
2 | Android: devices that support OpenGL ES 3, devices that support Vulkan iOS: iPhones starting from iPhone 5S, iPad Air, iPad mini 2nd generation, iPod 6th generation, AppleTV WebGL: all devices |
Tier2 | UNITY_HARDWARE_TIER2 |
3 | Desktop: OpenGL, Metal, Vulkan, DirectX 11+ | Tier3 | UNITY_HARDWARE_TIER3 |
Unity は、現在のグラフィックスティアの値を Graphics.activeTier に格納し、GraphicsTier enum で表します。現在のグラフィックスティアに基づいてカスタムの動作を加えるには、この値に対してテストします。
Graphics.activeTier
の値を上書きするには、それを直接設定します。グラフィックスティアに基づいて変化するシェーダーを Unity が読み込む前に、この設定を行う必要があります。この値を設定するのに適した場所は、メインシーンをロードする前のシーンです。
Unity エディターでは、 ティア設定 を行うことができます。ティア設定では、各ティアのグラフィックス機能を有効または無効にすることができます。
ティア設定を行うには、Unity の内部シェーダーコードの #define
プリプロセッサーディレクティブを変更します。これらの変更は、自動的にビルトインレンダーパイプライン用の事前にビルドされたシェーダー (例えば、スタンダードシェーダー )や、サーフェスシェーダー 用の内部シェーダーライブラリコードに影響を与えます。また、独自に書いたシェーダーにコードを加え、ティア設定に基づいて動作を変更することもできます。詳細については、グラフィックスティアとシェーダーバリアント を参照してください。
デフォルトのティア設定は、ほとんどのユースケースに適しています。パフォーマンスに問題がある場合や、デフォルトでは有効になっていない下位機種の機能を有効にしたい場合にのみ、設定を変更してください。
特定のビルドターゲットのグラフィックスティアごとに、異なるティアの設定を行うことができます。ティア設定の変更は、以下の方法で行うことができます。
エディターでティア設定をテストすることができます。これを行うには、Edit > Graphics Tier に移動し、Unity エディターで使用するティアを選択します。
ビルトインレンダーパイプラインでは、Unity はグラフィックスティアに対応した シェーダーバリアント を生成することができます。
ノート: これらのティアシェーダーバリアントは、通常のシェーダーバリアントとは異なります。ランタイムに Unity がシェーダーオブジェクトを CPU メモリにロードするとき、アクティブなティアのバリアントのみがロードされます。アクティブなティアのバリアントのみをロードし、他のティアのバリアントはロードしません。これにより、ティアバリアントのランタイムへの影響を軽減することができます。
ティアシェーダーバリアントを生成するために、Unity は以下の一連のシェーダーキーワード をすべてのグラフィックスシェーダーに加えます。
UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3
これらのキーワードを HLSL コードで使用すると、他のシェーダーキーワードと同じように、下位または上位のハードウェアに対する条件付きの動作を記述することができます。例えば、以下のようになります。
# if UNITY_HARDWARE_TIER1
// Tier 1 デバイス用のコードをここに記述
# else
// 他のデバイス用のコードをここに記述
# endif
HLSL コードでのシェーダーキーワードの扱い方については、HLSL でのシェーダーキーワードの宣言と使用 を参照してください。
Unity は、現在のビルドターゲットのティア設定に基づいて、以下のようにティアシェーダーのバリエーションを自動的に生成します。
すべてのティアシェーダバリアントを生成した後、Unity は、同一のティアシェーダバリアントを識別し、重複排除 します。つまり、2 つのティアの設定が同一である場合 (例えば、ティア 1 は異なるが、ティア 2 とティア 3 は互いに同一である場合)、これらのバリアントはアプリケーションのファイルサイズを増やすことはなく、Unity がティアバリアントをロードする方法は、ロード時間やランタイムのメモリ使用量に影響を与えないことを意味します。ただし、これではコンパイル作業が冗長になってしまいます。
ティアごとに異なる設定を使用したいが、冗長な作業になることがわかっている場合 (例えば、アプリケーションがティア 1 とティア 2 のデバイスでしか実行されないことがわかっている場合)、他のバリアントと同じように、不要なティアのバリアントをコンパイルから取り除くスクリプトを使用できます。詳しくは、シェーダーバリアントの削除 を参照してください。
自動動作に加えて、シェーダーごとにティアシェーダーバリアントを生成するよう Unity に強制することもできます。これは、HLSL コードでこれらの定数を使用し、現在のビルドのティア設定が互いに異なるかどうかにかかわらず、確実に必要なバリアントをコンパイルしたい場合に便利です。
手動で、指定したシェーダーのティアシェーダーバリアントを Unity に生成させるには、HLSL コードで #pragma hardware_tier_variants
プリプロセッサーディレクティブを使用し、ティアごとのバリアントを生成したいグラフィックス API を指定します。
# pragma hardware_tier_variants gles3
このディレクティブで使用できる有効なグラフィックス API 名のリストについては、ターゲットのグラフィックス API を参照してください。#pragma
ディレクティブに関する一般的な情報については、pragma ディレクティブ を参照してください。