6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unity Android で環境ごとにGraphics APIを切り替える方法

Last updated at Posted at 2026-01-18

この記事では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になっていているはずです。

image.png


[Auto Graphics API]をOFFにすると、GraphicsAPIのリストの編集が可能な状態になります。 「Vulkan」と「OpenGLES3」の2つのAPIが設定されている理由は、上にあるものほど優先順位が高く、 起動時、上から順にそのデバイスがそのAPIに対応しているか確認し選択されます。

image.png
(画像のものだとOpenGLES3が優先されます。)


今回、自分がこの記事を書くきっかけになった理由は「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の生成方法

image.png
Assetフォルダ下の適切な位置に画像のように、
Create > Vulkan Settings > Device Filter
で生成できます。

各項目

image.png

項目 内容
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とします。
その場合、設定方法は以下のようになります。

image.png

これでGoogle Pixelでは「Vulkan」の使用を制限された状態になります。
しかし、まだ設定は完了していません。


1つ目はProjectSettingでGraphicsAPIの「Vulkan」の優先度を1番上にします。

image.png

今回行った設定は「制限」のため「Vulkan」の優先度を上げておく必要があります。
※「OpenGLES3」の方が優先度が高い場合、GooglePixel以外の端末でも「OpenGLES3」が起動します。


2つ目は「Graphics API」の項目から下にスクロールすると「Vulkan Device Filtering Asset」という項目があるため、そこに今回作成したアセットを設定する必要があります。

image.png

以上で設定は完了になります。


今回行った設定が正しく動作しているか確認する方法は、 下記のMonoBehaviourをシーン上のオブジェクトに着けておくとわかるはずです。
GraphicsApiLogger.cs
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」の項目を確認し、
正しく設定が出来ているか確認してみてください。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?