Version: 2021.3
言語: 日本語
ビルトインレンダーパイプラインの使用
ビルトインレンダーパイプラインのレンダリングパス

グラフィックスティア

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

Note: This feature is only supported in the Built-in Render Pipeline. In other render pipelines, Unity still examines the hardware on startup and stores its value in Graphics.activeTier; however, the value of this field has no effect, and Unity does not perform any other operations relating to graphics tiers.

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

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

C#スクリプトによるグラフィックスティアの使用

Unity stores the value of the current graphics tier in Graphics.activeTier, represented by a GraphicsTier enum. To add custom behavior based on the current graphics tier, you can test against this value.

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 はティアシェーダーのバリアントを生成しません。
  • ティアの設定が少しでも異なっていれば、Unity はティアシェーダーバリアントをすべて生成します。

すべてのティアシェーダバリアントを生成した後、Unity は、同一のティアシェーダバリアントを識別し、重複排除 します。つまり、2 つのティアの設定が同一である場合 (例えば、ティア 1 は異なるが、ティア 2 とティア 3 は互いに同一である場合)、これらのバリアントはアプリケーションのファイルサイズを増やすことはなく、Unity がティアバリアントをロードする方法は、ロード時間やランタイムのメモリ使用量に影響を与えないことを意味します。ただし、これではコンパイル作業が冗長になってしまいます。

If you want to use different settings for different tiers, but you also know that this will result in redundant work - for example, if you know that your application will only ever run on tier 1 and tier 2 devices - you can use a script to strip unneeded tier variants from compilation, the same as for any other variants. For more information, see Shader variant stripping.

自動動作に加えて、シェーダーごとにティアシェーダーバリアントを生成するよう Unity に強制することもできます。これは、HLSL コードでこれらの定数を使用し、現在のビルドのティア設定が互いに異なるかどうかにかかわらず、確実に必要なバリアントをコンパイルしたい場合に便利です。

手動で、指定したシェーダーのティアシェーダーバリアントを Unity に生成させるには、HLSL コードで #pragma hardware_tier_variants プリプロセッサーディレクティブを使用し、ティアごとのバリアントを生成したいグラフィックス API を指定します。

# pragma hardware_tier_variants gles3

このディレクティブで使用できる有効なグラフィックス API 名のリストについては、ターゲットのグラフィックス API を参照してください。#pragma ディレクティブに関する一般的な情報については、pragma ディレクティブ を参照してください。

ビルトインレンダーパイプラインの使用
ビルトインレンダーパイプラインのレンダリングパス