![Hero background image](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F1dd5b288a0c76087248bf0dd78209716121cfe2d-1920x1080.jpg&w=3840&q=100)
テクニカルアーティストのためのモバイル最適化のヒント - パート
このページから得られるもの Unityで作業するモバイルゲーム開発者のための、アートアセットを最適化するためのヒント。これは の最初の記事です。モバイル・ゲームのためのアートの最適化についての記事です。
他にもモバイル最適化のヒントが満載 この包括的な電子書籍 とUnity Learnのコース モバイルアプリケーションの3Dアート最適化。
![ロボットキャラクターの3Dレンダリング](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F0356a832c4eec7f4ab68347dd98ca779808ff0d1-600x337.jpg&w=3840&q=75)
シルエットに注目
ポリゴンも頂点も、モバイル・プラットフォームでは計算コストが高い。アプリケーションのビジュアルクオリティに本当に貢献する部分にポリゴンを配置することで、処理予算を無駄にしません。
ほとんどのモバイルデバイスの画面サイズが小さく、アプリケーション内の3Dオブジェクトの位置も小さいため、3Dオブジェクトの小さな三角形の詳細が見えない場合があります。つまり、目に見えないような小さなディテールよりも、対象物のシルエットに貢献する大きな形やパーツに焦点を当てるべきだということだ。細かいディテールにはテクスチャとノーマルマップを使う。
![LODの例](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F168500b4e47bd0ed64c0d2fdb6a39eb14d211c8d-600x337.jpg&w=3840&q=75)
詳細レベル(LOD)を使用する
オブジェクトが遠方に移動するにつれて、LOD(Level of Detail)が調整されたり、よりシンプルなマテリアルとシェーダでよりシンプルなメッシュを使用するように切り替わったりして、GPUパフォーマンスを向上させることができます。
LOD準備のヒント
- 平らな部分にはより多くのポリゴンを削除し、LODの低いオブジェクトには三角形の密集した領域を使用しない。
- LODはシェーダーの複雑さにも適用できる。シェーダーとマテリアルは、遠くにある3Dオブジェクト用に最適化できる。例えば、カメラから遠ざかるにつれて、オブジェクトが使用するテクスチャの数を減らすことができます。
- 各LODレベル間のトライアングル数を50%減らす価値があることが多い。
- カメラからの距離を変えて、LODがどのように見えるかを確認してください。
- きれいなトポロジーは、変形したりアニメーションしたりするキャラクターやオブジェクトには不可欠です。
- 完璧なトポロジーにこだわる必要はない。テクスチャとマテリアルを適用すると、プレイヤーやエンドユーザーは3Dモデルのワイヤーフレームを見ることができなくなります。
LODを使用しない場合
LODはすべての状況に適しているわけではない。例えば、カメラビューとオブジェクトの両方が静止しているアプリケーションや、オブジェクトがすでに低いポリゴン数を使用しているようなアプリケーションでの使用は避けてください。LODは、リアルタイムで使用できるようにメッシュデータを保存する必要があるため、メモリのオーバーヘッドとファイルサイズが大きくなります。
![Unityのオクルージョン](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F17d61cfb010b119c0196182e47b20c988b5d5df9-600x337.jpg&w=3840&q=75)
メッシュを組み合わせてオブジェクトを隠す
レンダリングに必要な描画コールの回数を減らすために、複数のメッシュを1つにまとめることができる。このテクニックを適用するには、Hierarchyに空のGameObjectを作成し、それを結合したいメッシュの親とし、Mesh.CombineMeshes()メソッドを実装したスクリプトを親GameObjectにアタッチします。
オクルージョンカリングを使う
他のオブジェクトの後ろに隠れたオブジェクトは、潜在的にまだレンダリングされ、リソースのコストがかかる可能性があります。オクルージョン・カリングを使用して、それらを破棄する。
カメラビュー外のフラストラムカリングは自動で行われるが、オクルージョンカリングはベイクドプロセスである。オブジェクトをスタティックオクルーダーまたはスタティックオクルーディーとしてマークし、Window > Rendering > Occlusion Culling ダイアログでベイクするだけです。すべてのシーンで必要というわけではないが、カリングは多くの場合パフォーマンスを向上させる。詳しくは、チュートリアルの「オクルージョンカリングを使用する」をご覧ください。
![Unityにモデルをインポートする](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2Fa891baa2db8c8d374b01346a15b64d3e8a5a2079-600x337.jpg&w=3840&q=75)
モデルのインポート
モデルをインポートする際に覚えておくと良いヒントをいくつかご紹介します。
- アニメのタイプアニメーションデータを含まないFBX Meshをインポートする場合は、Import SettingsのRigタブでAnimation TypeをNoneに設定します。メッシュを階層に配置するとき、この設定はUnityが未使用のAnimatorコンポーネントを生成しないようにします。
- リグとブレンドシェイプを無効にする:メッシュにスケルタルやブレンドシェイプのアニメーションが必要ない場合は、可能な限りこれらのオプションを無効にしてください。
- 法線と接線を無効にする:メッシュ素材に法線や接線が必要ないことが確実な場合は、これらのオプションのチェックを外しておくと、さらに節約できます。
- インポート設定実行時にモデルを変更しない場合は、インポート設定のモデルタブで読み取り/書き込み有効オプションを無効にし、メモリ上にコピーが作成されないようにします。
- 静的/動的バッチング:スタティック・バッチは、描画コールの回数を減らす一般的な最適化手法である。レンダリング中に移動、回転、拡大縮小しない、多数の頂点からなるオブジェクトに最適です。ターゲットモデルのMesh Rendererを含むInspectorでStaticをチェックします。
![テクスチャ圧縮の比較](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F685cc6e38888cd06ff9a6ae9ee7b9673bb774b1c-600x400.png&w=3840&q=75)
テクスチャサイズとカラースペース
テクスチャは異なるサイズにすることができる。必要なディテールが少ないテクスチャのサイズを小さくすれば、帯域幅を削減できます。例えば、拡散テクスチャを1024×1024に設定し、関連する粗さ/金属マップを512×512に設定することができます。テクスチャーサイズを選択的に小さくするよう最善を尽くし、その後にビジュアルが劣化していないか常にチェックしてください。
ほとんどのテクスチャリングソフトウェアは、sRGBカラースペースを使用してテクスチャを処理し、エクスポートします。
sRGB色空間で拡散テクスチャを使用することをお勧めします。カラーとして処理されないテクスチャは、sRGBカラースペースであってはならない。テクスチャの例としては、メタリックマップ、ラフネスマップ、法線マップなどがある。これらのマップでsRGBを使用すると、素材上で間違ったビジュアルになります。
注:インスペクタウィンドウのsRGB(カラーテクスチャ)設定で、ラフネス、スペキュラ、法線マップ、または同様の項目にチェックが入っていないことを確認してください。
![屋根板のテクスチャーの詳細](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F213fcc96e296f82d90efd325e6c9fc864e827d56-810x270.jpg&w=3840&q=75)
テクスチャーにディテールを焼き込む
アンビエントオクルージョンや小さなスペキュラハイライトなどの要素は、ベイクインしてからディフューズテクスチャに追加できます。このアプローチは、スペキュラハイライトやアンビエントオクルージョンを得るために、計算コストのかかるシェーダーやUnityの機能に頼りすぎる必要がないことを意味します。
![グレイスケールのテクスチャデモ](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F9c7b826583364cc6c532626e5b93567da410bfd1-1020x680.jpg&w=3840&q=75)
グレースケールのテクスチャ
可能な限り、シェーダーで色調を調整できるグレースケールのテクスチャを使いましょう。これは、色合いを実行するカスタムシェーダを作成する代償として、テクスチャのメモリを節約します。すべてのオブジェクトがこの方法できれいに見えるわけではないので、この技法は厳選すること。均一な色を持つオブジェクトにこれを適用するのは簡単だ。
![テクスチャー・フィルタリングのバイリニアとトリリニアの比較](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F793815c0bfba817c3bf3a3d7196f17b955e450cc-600x400.png&w=3840&q=75)
テクスチャーフィルタリング
テクスチャフィルタリングはしばしばシーンのテクスチャ品質を向上させますが、より良いテクスチャ品質を達成するためにはより多くの処理を必要とすることが多いため、パフォーマンスを低下させることもあります。テクスチャフィルタリングは、GPUエネルギー消費の半分を占めることもあります。よりシンプルで適切なテクスチャーフィルターを選択することで、アプリケーションのエネルギー需要を減らすことができます。
- ニアレスト/ポイント・フィルタリング:これはテクスチャのフィルタリングの中で最もシンプルで計算量も少ない方法ですが、近くで見ると、このフィルタリングはテクスチャをブロックっぽく見せてしまうことがあります。
- バイリニア・フィルタリング:バイリニアフィルタリングは、テクスチャ内のピクセルを着色するために、隣接するテキセルをサンプリングして平均化します。最近接フィルタリングとは異なり、バイリニアフィルタリングでは、ピクセルが滑らかな勾配を持つため、ピクセルのブロック化が少なくなる。バイリニアフィルタリングの副作用として、テクスチャは近くで見るとぼやけて見えます。
![Unityエディタ上のスプライトアトラス](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2Fc538aea6e099ab32f6c66f336bf221eb5075d96b-1020x574.jpg&w=3840&q=75)
テクスチャサイズとカラースペース
メモリの大半はテクスチャに使われるでしょうから、ここでのインポート設定は非常に重要です。一般的に、資産をインポートする際には、以下のガイドラインに従うようにしてください。
- 最大サイズを下げる:視覚的に許容できる結果が得られる最小限の設定を使用してください。これは非破壊的で、すぐにテクスチャのメモリを減らすことができる。
- 2のべき乗(POT)を使う:Unityは、モバイルテクスチャ圧縮フォーマット(PVRCTまたはETC)のためにPOTテクスチャ寸法を必要とします。
- テクスチャーをアトラスに:複数のテクスチャを1つのテクスチャに配置することで、描画コールを減らし、レンダリングを高速化することができます。Unity Sprite AtlasまたはサードパーティのTexturePackertoを使用してテクスチャをアトラス化します。
- Read/Write Enabledオプションをオフに切り替える:このオプションを有効にすると、CPU と GPU の両方でアドレス指定可能なメモリにコピーが作成され、テクスチャのメモリ フットプリントが 2 倍になります。ほとんどの場合、これは無効にしておく。実行時にテクスチャを生成する場合は、Texture2Dでこれを強制します。 、makeNoLongerReadableを trueに設定して渡す。
- 不要なミップマップを無効にする:ミップマップは、2DスプライトやUIグラフィックスなど、画面上で一定のサイズを保つテクスチャには必要ありません。カメラからの距離が変化する3Dモデルでは、ミップマップを有効にしておきます。
- バイリニア・フィルタリングを使う:これにより、パフォーマンスとビジュアルクオリティのバランスを取ることができる。
- トリリニアフィルタリングを選択的に使用する:バイリニアフィルタリングよりも多くのメモリ帯域幅を必要とする。
- バイリニアと2倍の異方性フィルタリングを使用する:トリリニアや1x異方性ではなく、これらを選択することで、見た目も性能も向上する。
- 異方性のレベルを低く保つ:重要なゲームアセットには2以上のレベルを使用すること。
![圧縮テクスチャの比較](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F070cb1a5c9de94c9b82f2061b0027a405ec1f21d-810x226.jpg&w=3840&q=75)
テクスチャの圧縮
iOSとAndroidの両方でAdaptive Scalable Texture Compression(ATSC)を使用する。開発中のゲームの大半は、ATSC圧縮をサポートする最低スペックのデバイスをターゲットにする傾向がある。唯一の例外は
- A7以下のデバイス(例:iPhone 5、5Sなど)を対象としたiOSゲーム:PVRTCを使用
- 2016年以前の端末を対象としたAndroidゲーム:UseEricsson Texture Compression (ETC2)
![テクスチャ・チャンネル](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F6c2f6f3c2e156a06fd33de7806dda37b2a74827d-1020x680.jpg&w=3840&q=75)
テクスチャ・チャンネルを使って複数のテクスチャを1つにまとめる
テクスチャチャンネルパッキングは、1つのテクスチャに3つのマップを入れることができるので、テクスチャメモリの節約に役立ちます。これはテクスチャー・サンプラーの数を減らすことを意味する。ラフネス、スムースネス、メタリックネスを一つのテクスチャーにまとめるのによく使われる。どのテクスチャマスクにも適用できる。例えば、アルファマスクを保存することもできる。トランスペアレンシーを使用した画像は、32ビットフォーマットを必要とするため、メモリフットプリントが大きくなる可能性がありますが、アルファマスクを保存するために空きチャンネルを使用することで、拡散テクスチャを16ビットに保ち、ファイルサイズを効果的に半分にすることができます。
最も重要なマスクを保存するには、グリーン・チャンネルを使用する。私たちの目は緑に敏感で、青には鈍感だからだ。
![Probuilderの手動UVテクスチャ](/_next/image?url=https%3A%2F%2Fcdn.sanity.io%2Fimages%2Ffuvbjjlp%2Fproduction%2F798c18d0280b00a2fe5307f7541c6f598db33795-1020x574.jpg&w=3840&q=75)
UV 展開
UVマップは、2Dテクスチャを3Dモデルの表面に投影します。UVアンラップは、UVマップを作成するプロセスです。
- UVアイランドをパッキングしやすくし、無駄なスペースを減らすために、ラップされていないテクスチャの個々のユニットであるUVアイランドをできるだけまっすぐに保つことがベストプラクティスです。直線的なUVは、テクスチャの階段効果を防ぐのにも役立つ。
- モバイルプラットフォームでは、テクスチャスペースは限られています。そのため、テクスチャサイズはコンソールやPCよりも小さくなるのが普通です。優れたUVパッキングは、テクスチャの解像度を最大限に引き出します。
- より質の高いテクスチャを作るために、UVをまっすぐに保ち、少し歪んだUVを持つことを考慮してください。
- 場合によっては、形状の読みやすさを向上させるために、エッジや陰影を誇張して強調する必要がある。モバイルプラットフォームでは一般的に小さなテクスチャが使われるため、その小さなスペースで必要なディテールをすべてキャプチャするのは難しいかもしれません。
- モバイルアプリケーションの場合は、テクスチャの数を減らして、余分なディテールを1つのテクスチャにベイクします。ディテールの中には、ディフューズ・テクスチャ自体にベイクした方が、小さなモバイル画面でもディテールが見えるようになるものがあるからです。