マテリアルとシェーダー

Android ゲームでマテリアルとシェーダーの使用を最適化するには、次に示すおすすめの方法を採り入れます。

マテリアルとシェーダーは、最新の 3D アートの核となる構成要素です。最大級のデバイス数で適切に動作する 3D ゲームは、グラフィック プロセッサを最大限に活用できるよう設計された 3D アートから始まります。このガイドでは、モバイルにおけるマテリアルとシェーダーの最適化とおすすめの方法を紹介します。これにより、ゲームのパフォーマンスを向上させ、消費電力を最小限に抑えることができます。

この記事の一部は、Arm Limited が寄稿し、著作権を有する著作物に基づいています。

ゲームエンジン モバイル フレンドリー シェーダー

ゲームエンジンは、マテリアルとシェーダーを関連付ける方法が異なります。Unity エンジンでは複数のシェーダーを作成できますが、各マテリアルに割り当てることができるシェーダーは 1 つのみです。Unreal Engine 4 では、ターゲット プラットフォームに応じて異なるシェーダーをマテリアルに適用できます。

シェーダーとマテリアルの定義については、アーティスト向けのマテリアルとシェーダーに関するおすすめの方法をご覧ください。

Unity や Unreal Engine 4 などのゲームエンジンを使用している場合は、モバイル ハードウェア用に設計された組み込みシェーダーを使用します。これらのシェーダーでは、モバイル デバイスでのパフォーマンスを向上させるために、機能が簡略化されて実装されています。マテリアルを設定する際は、可能であれば使用していない機能をオフにします。これらの機能には、色合い調整やディテール マップなどがあります。使用していない機能を無効にすることで、エンジンは最終的なシェーダー プログラムからこれらの機能を省略し、パフォーマンスを向上させることができます。

Unity

Unity には複数のレンダリング エンジンがあります。最近のモバイルゲームでは、Universal Render Pipeline(URP)が最適です。 URP には標準的なシェーダーが含まれており、ターゲット プラットフォームに応じて複雑さが自動的にスケーリングします。従来の Unity レンダラには、モバイル プラットフォーム用に設計されたシェーダーのコレクションが含まれています。こうしたシェーダーは [Mobile] カテゴリにまとめられています。

Unreal Engine 4

Unreal エンジンは、選択されたターゲット プラットフォームに基づいてモバイル シェーダーを選択します。モバイル シェーダーのビジュアル出力は、デフォルトの Shader Model 5 シェーダーとは異なる場合があります。Unreal エディタでプレビュー レンダリング レベルを変更して、モバイル シェーダーのレンダリング出力をシミュレートできます。多少の違いはあるものの、Unreal はすべてのプラットフォームでマテリアルに同じプロセスを使用するため、モバイル シェーダーのビジュアルと動作は通常、デフォルトのシェーダーと同様になります。

Unreal エディタでのモバイル プレビュー レンダリングの設定
図 1. Unreal エディタでのモバイル プレビュー レンダリングの設定。

テクスチャ サンプラーを最小限に抑える

モバイル デバイスを対象とするゲームでは、マテリアルに使用するテクスチャを可能な限り少なくする必要があります。テクスチャを追加するたびにテクスチャ サンプリングが必要になります。これによりメモリ帯域幅が消費され、消費電力が増加します。Unreal Engine 4 では、モバイル デバイスで実行する場合、最大 5 つのマテリアル テクスチャを推奨しています。テクスチャ サンプラーが 5 つでも、多くのデバイスで広く使用するには非常に高価な場合があります。テクスチャ サンプラーの数を最小限に抑える戦略としては、以下のようなものがあります。

  • テクスチャ パッキングを使用してシングル チャネル テクスチャを結合する。この手法の詳細については、テクスチャのガイドをご覧ください。
  • ラフネスやメタリックなどのパラメータのデータを、テクスチャから読み取るのではなく、数値定数に置き換える。
  • より複雑なライティング モデルでライティング計算をサポートするために必要なテクスチャを省略できるように、ライトなしのシェーダーまたはシンプルなライティング モデルを使用する。

可能な場合はライティングを無効にする

ライトありとライトなしは、シェーダーとマテリアルに共通の区分けです。リアルタイム ライティングでは、シェーダーで追加の計算が行われます。実装されているライティング システムの種類によってはマテリアル テクスチャが必要になる場合がありますが、メモリ容量と帯域幅の使用量が多くなります。モバイルゲーム、特に性能の低いハードウェアを対象とするモバイルゲームでは、最適なパフォーマンスを実現するために、リアルタイム ライティングの使用を最小限に抑えることが重要です。定型化されたアートや漫画的なアートなど、リアルタイム ライティングを使用しなくても効果を発揮するデザインを中心として、アート ディレクションのデザインを検討する必要があります。

ライティングありとなしでレンダリングしたモデルの比較
図 2. リアルタイム ライティングありでレンダリングしたモデル(左)と、リアルタイム ライティングなしでレンダリングしたモデル(右)の例。

透明度の使用を最小限に抑える

可能な限り不透明なマテリアルを使用します。透明度のあるオブジェクトのレンダリングは、同等の不透明なオブジェクトよりも必ず高価になります。モバイル グラフィック ハードウェアの設計上、パソコンやゲーム機のグラフィック ハードウェアよりも透明度のレンダリング コストが比較的高くなります。ゲーム内に透明なオブジェクトを多数描画すると、特に重ね描画すると、パフォーマンスに悪影響を及ぼします。

同じピクセルを何度も描画する問題を、オーバードローといいます。透明度のある複数のレイヤをオーバードローしないでください。多くのゲームには、オーバードローを可視化して検出、除去できる診断ツールがあります。こうしたツールを使用して、ゲームのパフォーマンスを向上させ、フレームレートを低下させる問題領域を特定します。

Unity エディタのオーバードロー可視化ツールの例
図 3. Unity エディタのオーバードロー可視化ツールの例。
Unreal エディタのオーバードロー可視化ツールの例
図 4. Unreal エディタのオーバードロー可視化ツールの例。

適切なアルファ メソッドを使用する

透明度を実装する最も一般的な方法は、アルファ ブレンドとアルファテストです。

アルファテストでは、オブジェクト マテリアルが 100% 不透明または 100% 透明になります。このカットオフのためのアルファ値のしきい値を設定できます。Unity では、このタイプの透明度を Cutout といいます。Unreal Engine 4 では、これを Masked ブレンドモードといいます。

アルファ ブレンドでは、オブジェクト マテリアルに一定範囲の透明度を設定し、オブジェクトを部分的に透明に見せることができます。Unity は、このタイプの透明度を Transparent といいます。Unreal Engine 4 では、これを Translucent ブレンドモードといいます。

アルファ ブレンドとアルファテストの比較
図 5. 左はアルファ ブレンド(中央)とアルファテスト(右)を使用してレンダリングした画像の例(右)。

アルファ ブレンドは、一般的にアルファテストよりも優れた外観になります。ただし、葉のような特定のタイプのメッシュでは、メッシュをモーションで表示すると、アルファ ブレンドが不自然に見えることがあります。これは、枝葉が誤った順序でレンダリングされることで発生します。アルファテストはこの影響を最小限に抑えますが、その代わりにエイリアシングが増え、枝葉のエッジが鋭くなります。

アルファ ブレンドとアルファテストで、同じメッシュのレンダリングにかかる時間が異なる場合があります。どちらのモードでも許容可能なビジュアル出力になるメッシュについては、ベンチマークを行って、一方のメソッドが他方より優れているかどうかを確認する必要があります。

シェーダーの複雑度のプロファイリングを行う

テクスチャ サンプラー、ライティング、透明度などのレンダリング機能はすべて、シェーダーを複雑にし、レンダリングのパフォーマンスを低下させます。ゲームエンジンに組み込まれているツールや外部のグラフィック ツールを使用して、シェーダーの複雑度を評価できます。

Unreal Engine 4 には、Shader Complexity ビューモードがあり、シーン内のオブジェクトのコストを見積もることができます。

Unreal エディタの Shader Complexity ビューモード
図 6. Unreal エディタの Shader Complexity ビューモード。

また、Unreal の Material Stats 機能を使用して、マテリアルを作成する際のコストをプロファイリングすることもできます。

Unreal エディタの Material Stats 表示
図 7. Unreal エディタの Material Stats 表示。

頂点シェーダーで計算する

レンダリング シェーダーの計算は通常、頂点シェーダーとフラグメント(ピクセル)シェーダーに分かれます。通常、レンダリングされるフラグメントの数は頂点の数よりも多くなります。高価な計算を頂点シェーダーで実施できる場合は、フラグメント シェーダーで実施する場合よりも頻度が低くなります。

ただし、このデータがフラグメント シェーダーで消費される場合は、頂点シェーダーから渡す必要があります。転送するデータ量が多すぎる場合は、フラグメント シェーダーで計算した方がパフォーマンスが高い場合があります。プロファイリング ツールを使用してタイラーの使用率を評価し、一連の計算に最適なシェーダー位置を決定できます。Unreal Engine 4 には、このプロファイリングに役立つ カスタマイズされた UV 機能があります。

高価な数学演算を避ける

数学演算は、シェーダー出力の動作や外観を制御するためにシェーダー プログラムで使用されます。一般的な演算には、基本的な算術、べき乗、階乗、対数などがあります。数学演算の計算コストは同じではありません。高価な演算ばかりのシェーダーは、特に古いデバイスの場合、動作が遅くなります。比較的安価な演算の例を次に示します。

  • 加算
  • 減算
  • 乗算

高価な演算には次のようなものがあります。

  • 除算
  • 超越関数(正弦、余弦、べき乗、対数、正接)

パフォーマンスのプロファイリングを頻繁に行う

パフォーマンスのボトルネックは必ずしも明らかではありません。問題領域を推測せず、プロファイリング ツールを使用してレンダリング パフォーマンスを評価します。最適化の効果を正確に測定するために、最適化の前後で必ずテストを行ってください。