Version: Unity 6.0 (6000.0)
言語 : 日本語
ビルトインレンダーパイプラインでのグラフィックス品質設定
ビルトインレンダーパイプラインでのグラフィックス層の設定

ビルトインレンダーパイプラインのグラフィックスティア

ビルトインレンダーパイプラインでは、グラフィックスティアを使用して、アプリケーションを異なる性能のハードウェアで実行する場合に、さまざまなグラフィックス設定を適用することができます。Unity のビルトインティア設定を使用して一般的な設定を行うことができます。または、独自のシェーダーコードや C# コードでカスタムの動作を定義することもできます。

注意この機能はビルトインレンダーパイプラインでのみサポートされています。他のレンダーパイプラインでは、Unity は引き続き起動時にハードウェアを検証し、その値を Graphics.activeTier に保存します。ただし、このフィールドの値には効力がなく、Unity はグラフィックスティアに関連する他の処理を行いません。

グラフィックスティアの概要

Unity が最初にアプリケーションをロードするとき、ハードウェアとグラフィックス API を調査し、現在の環境がどのグラフィックスティアに対応しているかを判断します。

グラフィックスティアは以下の通り。

ハードウェア 対応するGraphicsTier enum 値 対応するシェーダーキーワード
1 iOS: iPhone 5S より前の iPhone (5S は含まれませんが、5C を含みます)、第 5 世代までの iPod、第 4 世代までの iPad、iPad mini 第 1 世代
デスクトップ:DirectX 9
XR /XRHoloLens
Tier1 UNITY_HARDWARE_TIER1
2 Android: OpenGL ES 3 をサポートするデバイス、Vulkan をサポートするデバイス
iOS: iPhone 5S、iPad Air、iPad mini 第2世代、iPod 第6世代、AppleTV 以降の iPhone
WebGL: すべてのデバイス
Tier2 UNITY_HARDWARE_TIER2
3 デスクトップ:OpenGL、Metal、Vulkan、DirectX 11 以降 Tier3 UNITY_HARDWARE_TIER3

グラフィックスティアとシェーダーバリアント

ビルトインレンダーパイプラインでは、Unity はグラフィックスティアに対応したシェーダーバリアントを生成することができます。

注意これらのシェーダーバリアントは、通常のシェーダーバリアントに対して異なる動作を示します。ランタイムに、Unity は CPU メモリにオブジェクトをロードする際に、アクティブなティアのバリアントのみをロードし、他のティアのバリアントはロードしません。これにより、ティアバリアントのランタイムへの影響を軽減することができます。

ティアシェーダーバリアントを生成するために、Unity は以下の一連のシェーダーキーワードをすべてのグラフィックスシェーダーに追加します。

UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3

これらのキーワードを HLSL コードで使用すると、他のシェーダーキーワードの場合と同じように、下位または上位のハードウェアに対する条件付きの動作を記述することができます。 例:

#if UNITY_HARDWARE_TIER1
// Put code for tier 1 devices here
#else
// Put code for other devices here
#endif

HLSL コードでのシェーダーキーワードの扱い方について詳しくは、HLSL でのシェーダーキーワードの宣言と使用を参照してください。

Unity は、現在のビルドターゲットのティア設定に基づいて、以下のようにティアシェーダーのバリエーションを自動的に生成します。

  • すべてのティアの設定が同一であれば、Unity はティアシェーダーのバリアントを生成しません。
  • ティアの設定が少しでも異なっていれば、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 ディレクティブを参照してください。

ビルトインレンダーパイプラインでのグラフィックス品質設定
ビルトインレンダーパイプラインでのグラフィックス層の設定