テクスチャ

Android ゲームでテクスチャの外観とパフォーマンスを最適化するには、次に示すおすすめの方法を採り入れます。

テクスチャは 3D アートの重要な要素です。3D ゲームが多数のデバイスで適切に動作できるかどうかは、3D アートがグラフィック プロセッサをいかに効率よく活用できるかにかかっています。このガイドでは、モバイルにおけるテクスチャの最適化とおすすめの方法を紹介します。これにより、ゲームのパフォーマンスを向上させ、高画質を維持しつつ消費電力を最小限に抑えることができます。

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

テクスチャ アトラスを作成する

テクスチャ アトラスは、3D メッシュや 2D スプライトなど、複数のグラフィック オブジェクトの画像データを格納するためのテクスチャです。それぞれのオブジェクトに対して個別にテクスチャを設定するのではなく、アトラス テクスチャを使用して各オブジェクトの画像を結合します。

テクスチャ アトラスを共有するメッシュ
図 1. レンダリングされたシーンの黄色のハイライト(左)は、テクスチャ アトラスを共有するメッシュの輪郭(右)を示します。

ゲームフレームの描画呼び出し回数を最小限に抑えることは、最適なレンダリング パフォーマンスを実現するうえで重要です。異なるオブジェクトに同じテクスチャを使用することで、1 回の描画呼び出しで複数の画像を表現できます。CPU バウンドのゲームでは描画呼び出しの削減が特に重要です。これは、各描画呼び出しがグラフィック ドライバで処理される際に CPU オーバーヘッドが発生するためです。テクスチャ アトラスは、ゲームのランタイム データに含まれるテクスチャ アセット ファイルの数も削減します。 何百、何千ものテクスチャを、はるかに少ない数のテクスチャ アトラス ファイルに統合できます。

テクスチャ アトラス レイアウトは、3D メッシュを作成する際に考案するとよいでしょう。メッシュ アセットを作成する前にアトラスをオーサリングすると、メッシュ アセットをテクスチャ アトラスに従って UV 展開する必要があります。また、ペイント ソフトウェアのマージツールやアトラス作成ツールを使って、オーサリング後にアトラスを作成すれば、UV アイランドをテクスチャに合わせて再配置する必要も出てきます。

エンジン別の描画呼び出しバッチ処理

Unity ゲームエンジンには、オブジェクトを自動的に結合できる描画呼び出しバッチ処理機能があります。オブジェクトを自動バッチ処理するには、そのオブジェクトがテクスチャなど共通のマテリアルを共有し、静的とマークされている必要があります。

Unreal Engine 4 では、バッチ処理を手動で設定する必要があります。3D ソフトウェアでオブジェクトを結合してから Unreal にインポートできます。Unreal には、メッシュを組み合わせてテクスチャ アトラス ファイルを作成できる UE4 Actor Merging ツールも含まれています。

mipmap を生成する

mipmap は、テクスチャの低解像度バージョンです。特定のテクスチャの mipmap をまとめたものを mipmap チェーンといいます。チェーン内で下位レベルの mipmap の解像度は、上位レベルの解像度より低くなります。mipmap は、レンダリング時にテクスチャ LOD(詳細レベル)を実装するために使用します。mipmap のテクスチャがテクスチャ ステージにバインドされると、グラフィック ハードウェアはフラグメントが占めるテクスチャ空間を使用して mipmap チェーンからレベルを選択します。3D シーンをレンダリングする場合、カメラの遠くにあるオブジェクトは、カメラの近くにある同じオブジェクトよりも解像度の低い mipmap を使用します。

mipmap のテクスチャは、mipmap でないテクスチャよりメモリを多く使用します。mipmap レベルを追加すると、テクスチャのメモリ フットプリントが 33% 増加します。テクスチャがカメラから一定の距離で描画される場合、mipmap を生成することは、不必要なメモリ使用になります。

テクスチャの基本解像度が 512×512 ピクセルの mipmap チェーン
図 2. mipmap チェーン。テクスチャの基本解像度は 512×512 ピクセルです。

mipmap を正しく使用すると、GPU のパフォーマンスが向上します。解像度の低い mipmap レベルを利用することで、メモリ帯域幅の使用量が減少し、テクスチャのキャッシュ常駐が改善されます。

また mipmap を使用して、テクスチャのエイリアシングを減らすことで画質を向上させることもできます。テクスチャのエイリアシングは、カメラから離れた領域にちらつきとして現れます。

テクスチャのエイリアシングの例
図 3. テクスチャのエイリアシングの例。左の画像は mipmap なしでレンダリングし、右の画像は mipmap ありでレンダリングしています。左の画像では、赤い四角形の中にテクスチャのエイリアシングが見られます。

エンジン別の mipmap の詳細

Unreal Engine 4 で mipmap を使用するには、テクスチャ寸法が 2 のべき乗(512×1,024、128×128 など)である必要があります。一方または両方のテクスチャ寸法が 2 のべき乗でない場合、mipmap チェーンは生成されません。

Unity エンジンは、寸法が 2 のべき乗でないテクスチャを自動的にスケーリングして mipmap を作成します。このスケーリングを回避するには、ソース テクスチャ ファイルの寸法が 2 のべき乗であることを確認します。

適切なテクスチャ フィルタリング モードを選択する

テクスチャ フィルタリングは、レンダリングされた三角形の外観に影響を与えるハードウェア レンダリング機能です。テクスチャ フィルタリングを適切に使用すると、シーンの画質が向上します。テクスチャ フィルタリングには複数のモードがあり、ぞれぞれレンダリングの改善とコストのバランスが異なります。コストには、演算時間とメモリ帯域幅の両方が含まれます。一般的に利用できるテクスチャ フィルタリング モードは、ニアレスト(またはポイント)、バイリニア、トライリニアの 3 つです。バイリニアまたはトライリニア フィルタリングと組み合わせることができる、異方性というテクスチャ フィルタリング方法もあります。

ニアレスト

ニアレストは、最も簡単でコストのかからないテクスチャ フィルタリング モードです。ニアレストでは、ソース テクスチャの指定された座標を使用して、1 つのテクセルがサンプリングされます。ニアレストでレンダリングされた三角形は、特にカメラ近くでレンダリングされた場合、見た目がブロック状またはモザイク状になります。

バイリニア

バイリニア フィルタリングは、ソース テクスチャの指定された座標を囲む 4 つのテクセルをサンプリングします。この 4 つのテクセルを平均して、フラグメントのテクスチャ色を決定します。バイリニア フィルタリングでは、ピクセル間のグラデーションが滑らかになり、ニアレスト フィルタリングでブロック状に見えていた現象を回避できます。カメラ近くでレンダリングされた三角形は、モザイク状ではなくぼやけて表示されます。バイリニアではテクセル サンプルの数と平均化処理が追加されているため、ニアレストよりもコストがかかります。

ニアレスト フィルタリングとバイリニア フィルタリングの比較
図 4. ニアレスト テクスチャ フィルタリング(左)とバイリニア テクスチャ フィルタリング(右)の比較。

トライリニア

カメラから頂点までの距離が変化するメッシュをレンダリングする場合、レンダリング時に複数の mipmap レベルが選択されることがあります。2 つの mipmap レベル間の変化によって、遷移点が顕著な鋭いカットとして表示されることがあります。トライリニア フィルタリングは、2 つの異なる mipmap レベルに対してバイリニア フィルタリングを行い、その結果を補間することで、このような鋭い遷移点をより滑らかにします。複数の mip レベルを使用し、補間処理が必要となるため、トライリニアはバイリニアよりも計算コストが高くなります。

バイリニア フィルタリングとトライリニア フィルタリングの比較
図 5. バイリニア テクスチャ フィルタリング(左)とトライリニア テクスチャ フィルタリング(右)の比較。ズームした領域は、mipmap の遷移に伴うレンダリングの違いを対比しています。

異方性

異方性フィルタリングを使用すると、カメラに対して極端な角度でレンダリングされるテクスチャ メッシュの画質が向上します。この種のメッシュの例としては、地面が一般的です。異方性フィルタリングが機能するには、mipmap のテクスチャが必要です。レンダリング時に適用される異方性フィルタリングの比率またはレベルは設定できます。異方性フィルタリングのコストは、レベルが上がるほど高くなります。

1 倍異方性フィルタリングと 2 倍異方性フィルタリングの比較
図 6. バイリニア/1 倍異方性フィルタリング(左)とバイリニア/2 倍異方性フィルタリング(右)の比較

モード選択戦略

一般に、バイリニア フィルタリングはパフォーマンスと画質のバランスが最良です。トライリニア フィルタリングは、かなり多くのメモリ帯域幅を必要とするため、選択的に使用する必要があります。多くの場合、2 倍異方性フィルタリングと組み合わせたバイリニア フィルタリングの方が、1 倍異方性フィルタリングと組み合わせたトライリニア フィルタリングよりも、外観とパフォーマンスに優れています。異方性レベルを 2 倍より大きくすると非常にコストがかかるため、重要なゲームアセットに限って行う必要があります。

テクスチャ フィルタリングは最大で GPU エネルギーの合計消費量の半分を占めることもあります。できる限りシンプルなテクスチャ フィルタを選択すると、ゲームの消費電力を効果的に削減できます。

テクスチャのサイズを最適化する

テクスチャの寸法を可能な限り小さくしながら、希望の画質を得るようにしてください。テクスチャ アセットを見直し、テクスチャが誤って大きくなっていないかどうかを確認します。この原則は、ディスクリート テクスチャとアトラス テクスチャの両方に当てはまります。ゲームで多数のデバイスをサポートし、解像度やパフォーマンスも多岐にわたっている場合は、それぞれのデバイスクラスに合ったテクスチャ アセット(低解像度と高解像度の両方)を作成するとよいでしょう。

マテリアルで複数のテクスチャを使用するメッシュをレンダリングする場合は、一部のテクスチャの解像度を選択的に下げることを検討してください。たとえば、1024×1024 のディフューズ テクスチャを使用する場合、ラフネスまたはメタリック マップ テクスチャを 512×512 に縮小しても、画質への影響は最小限に抑えられる可能性があります。こうしたサイズ変更のテストがもたらす影響を検証し、希望の品質レベルを損なわないようにします。

適切な色空間を使用する

テクスチャのオーサリングに使用されるソフトウェア パッケージの多くは、sRGB 色空間で動作し、sRGB 色空間を使用してエクスポートします。色として処理されないディフューズ テクスチャは sRGB 色空間を使用できます。メタリック マップ、ラフネスマップ、法線マップなど、色として処理されないテクスチャは sRGB 色空間を使ってエクスポートしないでください。

ゲームエンジンのテクスチャ設定には、テクスチャが sRGB 色空間を使用するかどうかのパラメータがあります。

Unity と Unreal Engine 4 の sRGB テクスチャ設定
図 7. Unity(左)と Unreal Engine 4(右)の sRGB テクスチャ設定。

このようなテクスチャのピクセルデータは色データとして使用されないため、sRGB 色空間を使用すると映像が不正確になります。

リニアと sRGB 色空間でのラフネス メタリック マップのレンダリング
図 8. リニア(非 sRGB)ラフネス メタリック マップ(左)と sRGB ラフネス メタリック マップ(右)。右側の画像の反射は正しくありません。

テクスチャ圧縮を使用する

テクスチャ圧縮は、圧縮されていないピクセルデータに適用される画像圧縮アルゴリズムで、レンダリング時にグラフィック ハードウェアによって迅速に伸張できるテクスチャを生成します。テクスチャ圧縮を効果的に使用して画質への影響を最小限に抑えながら、メモリ使用量を減らし、パフォーマンスを向上させることができます。Android で一般的なテクスチャ圧縮アルゴリズムは、ETC1、ETC2、ASTC の 3 つです。 最近のゲームでは一般的に ASTC が最適であり、ETC2 は、ASTC をサポートしていないデバイスをターゲットとするゲームの場合の代替オプションとなります。

ETC1

ETC1 はすべての Android デバイスでサポートされています。ETC1 は、RGB カラーデータのピクセルあたり 4 ビットのモードのみをサポートしています。ETC1 はアルファ チャネルをサポートしていません。ETC1 をサポートする多くのゲームエンジンは、アルファ チャネル データを表すために 2 つ目の ETC1 テクスチャを指定できます。

ETC2

ETC2 は、アクティブな Android デバイスの 90% 以上でサポートされています。OpenGL ES 3.0 API をサポートしていない非常に古いデバイスでは ETC2 を使用できません。ETC2 にあって ETC1 にないものは、以下のとおりです。

  • アルファ チャネルのサポート、8 ビットと 1 ビットの「パンチスルー」
  • RGB テクスチャと RGBA テクスチャの sRGB バージョン
  • 1 チャネルと 2 チャネル、R11 と RG11、テクスチャ

ASTC

ASTC はアクティブな Android デバイスの 75% 以上でサポートされています。ASTC は圧縮ブロックサイズを設定できるため、特定のテクスチャについて、圧縮率と画質のバランスを取るようきめ細かく制御できます。一般に、ASTC は ETC2 と同じメモリサイズでより優れた画質を達成でき、ETC2 より小さいメモリサイズで同程度の圧縮率を達成できます。

同じソース画像を使用した、テクスチャ圧縮形式の表示の比較
図 9. 非圧縮画像(左、サイズ 17 MB)、ETC1 で圧縮(中央、サイズ 3 MB)、ASTC で圧縮(右、サイズ 2.5 MB)の画像の比較。

テクスチャ圧縮速度

テクスチャの数が多いゲームの場合、テクスチャ圧縮に時間が長くかかります。ETC と ASTC はどちらも圧縮品質の設定を選択できます。品質設定が高いほど圧縮に時間がかかります。開発の際は品質レベルを下げて圧縮時間を短縮し、重要なビルドを作成する前に品質レベルを上げることをおすすめします。

ゲームエンジンでのテクスチャ圧縮

ゲームエンジンを使用している場合、プロジェクト単位でテクスチャ圧縮形式(ETC または ASTC)を選択する必要が生じることがあります。互換性を最大限確保するために複数の圧縮形式をサポートするには、追加の作業が必要になることがあります。Google Play Asset Delivery のテクスチャ圧縮形式のターゲット設定機能を使用すると、ゲームに複数の形式を含めることができ、インストール時に最適な形式のみを個々のデバイスに配信できます。

UV 展開する

UV アイランドはできるだけまっすぐにします。これにより、テクスチャは次のようになります。

  • UV アイランドのパッキングが容易になり、無駄なスペースが少なくなります。
  • UV がまっすぐであることにより、テクスチャの「階段効果」が低減されます。
  • UV パッキングが適切であることにより、テクスチャから最適な解像度を得ることができます。
  • まっすぐにすることで UV が多少歪んでも、テクスチャの品質が向上します。
最適化されていない UV アイランドと最適化された UV アイランドの比較
図 10. 最適化されていない UV アイランド(左)と、まっすぐに/ラップされていない UV アイランド(右)。

テクスチャのシームが見えると、モデルの見栄えが悪くなります。UV のシームは目立たない場所に配置するようにします。よりよい法線マップを作成するため、エッジが鋭くなるように UV アイランドを分割し、アイランドの周囲にスペースを確保します。

認識できないほどのディテールを避ける

アートを作成する際は、特に画面の小さいデバイス向けのゲームでは、目に見えないほどのディテールを加えないでください。部屋の隅にあるほとんど見えない小さな椅子のモデルでは、4,096×4,096 の緻密なテクスチャを作成しても無駄になります。場合によっては、形状を認識しやすくするために、エッジの強調(ハイライトの追加)やシェーディングを行う必要があります。

遠くにレンダリングされたモデルに小さなテクスチャが使用されている
図 11. 遠くにレンダリングされた兵士のモデルに、過剰なディテールのない 256×256 の小さなテクスチャが使用されています。

ディテールをベイクする

モバイル デバイスは、パソコンやゲーム機よりも画面が小さく、グラフィック ハードウェアの性能も劣ります。アンビエント オクルージョンやスペキュラ ハイライトのような効果を実行時に計算するのではなく、可能であればディフューズ テクスチャに「ベイク」することを検討してください。これによりパフォーマンスが向上し、ディテールの視認性が確保されます。

ハイライトとアンビエント オクルージョンをディフューズ テクスチャにベイクする
図 12. ハイライトとアンビエント オクルージョンをディフューズ テクスチャにベイク(左)し、ゲーム内でレンダリング(右)。

着色処理を使用する

カスタム シェーダーを作成でき、メッシュのカラーパターンが類似しているか均一である場合は、該当するメッシュで着色処理を使用することを検討してください。着色処理では、RGB テクスチャの場合よりもテクスチャ メモリが少なくて済む、グレースケール テクスチャが使用されます。頂点ごとの色データがシェーダーによって適用され、メッシュが着色されます。他に、RGB マスクを使用し、マスクの色範囲に基づいてテクスチャを適用するという着色方法もあります。

実行時に着色処理されたグレースケールのテクスチャ
図 13. グレースケールのテクスチャ(左)が実行時に着色された、柱のモデル(右)

テクスチャ チャネルをパックする

複数のテクスチャを使用してマテリアルをレンダリングする場合は、1 つのカラーチャネルのみを使用するテクスチャを、3 つのカラーチャネルすべてを使用する 1 つのテクスチャに統合するようにします。これにより、メモリ使用量が減り、フラグメント シェーダーで行われるテクスチャ サンプラー オペレーションの数が減ります。

1 つのマルチチャネル テクスチャに統合された 3 つのシングル チャネル テクスチャ
図 14. 3 つのシングル チャネル テクスチャ(左)が 1 つのマルチチャネル テクスチャ(右)に統合されています。アンビエント オクルージョン データは赤色に、ラフネス / スムーズネス マップは緑色に、メタリック マップは青色に割り当てられています。

パックする際は、最も詳細なデータが緑チャネルに割り当てられます。人間の目は緑色に敏感であるため、グラフィック ハードウェアは通常、緑チャネルにビットを多く割り当てます。たとえば、ラフネス / スムーズネス マップは通常、メタリック マップよりも詳細であり、緑チャネルへの割り当てが適しています。

アルファ チャネルを使用するマテリアルについて、パックされたテクスチャで 2 つのチャネルしか使用しない場合は、パックされたテクスチャに、ディフューズ テクスチャではなくアルファ チャネル データを配置することを検討してください。ディフューズ テクスチャの形式によっては、アルファ チャネル データを省略することで、サイズを小さくしたり、画質を改善したりできます。

別のテクスチャにパックされたアルファ チャネル
図 15. アルファ チャネルの不透明度マップは、ラフネス/スムーズネス マップ、メタリック マップとともにテクスチャにパックされています。

パックされたテクスチャの色空間が sRGB ではなくリニア RGB に設定されていることを確認してください。

法線マップを作成する

法線マッピングは、追加のジオメトリを使用せずに 3D モデルにディテール感を持たせる手法です。しわやボルトなど、モデル作成に多くの三角形が必要になる可能性があるフィーチャーは、法線マップを使用してシミュレートできます。法線マッピングが適しているかどうかは、ゲームのアートスタイルや方向性によります。

レンダリングに法線マップを使用したモデルと使用しなかったモデル
図 16. 法線マップなしでレンダリングされたモデル(左)と、法線マップ(中央)と法線マップのテクスチャでレンダリングされた同じモデル(右)。

法線マップはパフォーマンス コストがかかるため、低価格帯のデバイスを対象とする場合は控えめに使用してください。法線マップには追加のテクスチャが必要となるため、テクスチャ サンプリングとフラグメント シェーダーの計算が追加されます。

法線マップに関するおすすめの方法

法線マップの作成に関するおすすめの方法は次のとおりです。

ケージを使用する

ケージは、低ポリゴンモデルを大きくしたもの、つまり押し広げたものです。法線マップをベイクする際、適切に機能させるには、高ポリゴンモデルを包含する必要があります。ケージは、法線マップのベイク時にレイキャスト距離を制限するために使用されます。これにより、法線マップで法線のシームが分割される問題を回避できます。

低ポリゴン メッシュを囲むケージ
図 17. 低ポリゴン メッシュを囲むケージ。
法線マップを使用してレンダリングしたモデル(ケージあり / ケージなし)
図 18. ケージありで生成された法線マップを使用してレンダリングされたモデル(左)と、ケージなしで生成された法線マップを使用してレンダリングされたモデル(右)の比較。

メッシュ名でマッチングしてベイクする

ベイキング ソフトウェアが対応していれば、メッシュ名でマッチングしてベイクします。この機能により、誤った法線マップ投影の問題が軽減されます。オブジェクト同士が近すぎると、法線マップが誤った面に投影されることがあります。メッシュ名でマッチングすると、正しい面でのみベイクが行われます。Substance Painter のこの機能について詳しくは、こちらのページをご覧ください。 Marmoset Toolbag のこの機能について詳しくは、こちらのページをご覧ください

メッシュをエクスプロードする

ベイクする際、メッシュ名でマッチングできない場合は、メッシュのエクスプロードを検討してください。メッシュをエクスプロードするとパーツ同士が離れるため、法線マップが誤った面に投影されることがありません。アンビエント オクルージョンのベイクも行う場合は、エクスプロードしていないメッシュで別途ベイクする必要があります。

法線マップのベイクのためにエクスプロードしたメッシュ
図 19. 法線マップのベイクのためにエクスプロードしたメッシュ

シームを最小限に抑える

ハードエッジに UV が連続するとシームが目立ちます。ハードエッジの UV を分割すると、この影響を最小限に抑えることができます。スムージング グループを設定するときは、目安として角度を 90 度未満にしてください。UV のシームでは、三角形に別のスムージング グループを設定する必要があります。