この記事ではUnityでAndoridアプリの開発を行った際、デバイスごとにGraphics APIを切り替える方法を紹介します。
※ここで紹介するものは「6000.3.0f1」以降のバージョンでのみ使用できる機能になります。
(SUPPORTEDを除く)
結果から知りたい人はこちら
環境
Unity 6000.3.4f1
Graphics APIとは
大前提「Graphics API」とは?
大雑把な説明になりますが、Unityでアプリを開発する際、シーンに配置した画像や3Dモデルはカメラを通して描画され、スマホやPCの画面に表示されます。
その描画処理(頂点変換・ピクセルの色計算など)は主にGPUが行い、Unityは「どのデータを使って、どのシェーダで、どの順に描画するか」といった命令をGPU側に送ります。
このとき、UnityがGPUドライバに描画命令やリソース操作を伝えるための窓口となるのが Graphics API(DirectX / Vulkan / Metal など)です。
Unity → Graphics API → GPUドライバ → GPU
なぜGraphicsAPIを切り替える必要がある?
大きく分けて4つの理由があります。
1.プラットフォームによる都合
iOS/macOS → Metal
Windows → D3D11/D3D12
Android → Vulkan/OpenGL
プラットフォームによって切り替える必要がありますが、このあたりは勝手にUnityが管理してくれます。
2.パフォーマンスの差
Metal/D3D12/VulkanはCPUの負担を減らし、うまく使えば高速になりやすく、
D3D11/OpenGLは扱いやすい代わりにオーバーヘッド(無駄)が出やすいです。
3.機能
この機能はこのAPIでのみ使用可能といったケース
4.相性
Graphic API + GPUドライバ + GPU
の相性が悪い(クラッシュ、描画崩れ、フリーズなどが発生)
まず、基本的にGraphicsAPIはランタイム中に切り替えることはできません。
そして、どのプラットフォーム向けのアプリなのか決まった時点で、どのAPIを使用するかほとんど絞られている状態のはずです。
(iOS向けならMetalを使用するなど)
このあたりUnityが勝手に切り替えてくれるため、Unityで開発している場合、GraphicsAPIを意識することはほとんどかないかもしれません。
GraphicsAPIの設定方法
Project Setting > Player > Android > OtherSetting
から設定できます。
デフォルトの設定だと[Auto Graphics API]がONになっていているはずです。
[Auto Graphics API]をOFFにすると、GraphicsAPIのリストの編集が可能な状態になります。 「Vulkan」と「OpenGLES3」の2つのAPIが設定されている理由は、上にあるものほど優先順位が高く、 起動時、上から順にそのデバイスがそのAPIに対応しているか確認し選択されます。
今回、自分がこの記事を書くきっかけになった理由は「4.相性」によるものです。
具体的には、あるゲームでURPのSRPバッチャーを使用しているシーンに入ると特定のAndroid端末(端末A)で描画崩れが発生しました。
このときの設定は[Auto Graphics API]をONにしていたため、OFFにしたうえで「OpenGLES3」の優先度を上げると、描画崩れが解消されました。
しかし、OpenGLES3を優先していると、また別のAndroid端末(端末B)でクラッシュが発生しました。
この端末は「Vulkan」だと問題なく動作していたため、相性は以下のようになります。
| 端末A | 端末B | |
|---|---|---|
| Vulkan | × | 〇 |
| OpenGLES3 | 〇 | × |
※正確には相性が悪いのは端末とAPIではなく、端末に搭載されているGPUとGraphicsAPIの相性です。
ProjectSettingからできるのは優先度の設定のみ、 端末A,Bは相性が悪いというだけで、「Vulkan」「OpenGLES3」どちらでも基本的な動作は問題がないため2つのAPIに対応している。
そのため、ProjectSettingからは端末Aでは「OpenGLES3」、端末Bでは「Vulkan」を使用するといった設定を行うことはできません。
そこで使用するのが、Unity「6000.3.0f1」以降に搭載された「Vulkan Device Filtering Asset」という機能になります。
※SUPPORTEDはもっと前から実装されている?
Vulkan Device Filtering Asset
この機能は、特定の端末では「Vulkan」それ以外の端末は「Vulkan以外」を使用するといった設定を行うことが出来ます。
Assetの生成方法

Assetフォルダ下の適切な位置に画像のように、
Create > Vulkan Settings > Device Filter
で生成できます。
各項目
| 項目 | 内容 |
|---|---|
| Allow Filters | 指定されたパラメータに対応したデバイスでVulkanを使用することを許可する |
| Deny Filters | 指定されたパラメータに対応したデバイスでVulkanを使用することを制限する |
| Preferred Graphics Jobs Filter | 指定されたパラメータに対応したデバイスでの設定したジョブモードを有効にする |
今回使用する項目は「Deny Filters」というリストになります。
「Deny Filters」のパラメータ
各パラメータの内容と設定方法は以下になります。
| 項目 | 内容 | 例 |
|---|---|---|
| Vendor | GPUハードウェアのベンダー名 | ^ARM$(正規表現OK) |
| Device Name | GPUのモデル名 | Mali.*G78(正規表現OK) |
| Brand | 端末のメーカー | ^[Gg]oogle$(正規表現OK) |
| Product Name | 端末のコードネーム(特定機種のみ弾きたいとき仕様) | ^DeviceA$(正規表現OK) |
| Android OS version | 端末のOSバージョン | ^13$(正規表現OK) |
| Vulkan API version | 端末が持つ Vulkan API バージョン | 1.1.128(指定したバージョン以下を弾く、「Allow Filters」の場合は以上を許可) |
| Driver version | Vulkanドライババージョン | 0.676.0(指定したバージョン以下を弾く、「Allow Filters」の場合は以上を許可) |
前述の例から「Vulkan」をデフォルトのAPIとした場合、「Vulkan」の使用を制限しないといけないのは端末Aになります。
端末Aをここでは仮にGoogle Pixelとします。
その場合、設定方法は以下のようになります。
これでGoogle Pixelでは「Vulkan」の使用を制限された状態になります。
しかし、まだ設定は完了していません。
1つ目はProjectSettingでGraphicsAPIの「Vulkan」の優先度を1番上にします。
今回行った設定は「制限」のため「Vulkan」の優先度を上げておく必要があります。
※「OpenGLES3」の方が優先度が高い場合、GooglePixel以外の端末でも「OpenGLES3」が起動します。
2つ目は「Graphics API」の項目から下にスクロールすると「Vulkan Device Filtering Asset」という項目があるため、そこに今回作成したアセットを設定する必要があります。
以上で設定は完了になります。
今回行った設定が正しく動作しているか確認する方法は、 下記のMonoBehaviourをシーン上のオブジェクトに着けておくとわかるはずです。
using UnityEngine;
public class GraphicsApiLogger : MonoBehaviour
{
void Awake()
{
Debug.Log($"GraphicsDeviceType: {SystemInfo.graphicsDeviceType}");
Debug.Log($"GraphicsDeviceName: {SystemInfo.graphicsDeviceName}");
Debug.Log($"GraphicsDeviceVendor: {SystemInfo.graphicsDeviceVendor}");
Debug.Log($"GraphicsDeviceVersion: {SystemInfo.graphicsDeviceVersion}");
}
}
端末にビルドした後、「GraphicsDeviceType」の項目を確認し、
正しく設定が出来ているか確認してみてください。





