
ジオメトリに関するその他のベストプラクティス
Tutorial
intermediate
+0XP
15 mins
Unity Technologies
このチュートリアルでは、モバイルアプリケーションのジオメトリを操作しつつ、最適化を行うことを最優先事項とした場合に使えそうな、その他のベストプラクティスについて考察していきます。
1. 概要
以前のチュートリアルでの推奨事項以外にも、モデルを作成する際に考慮すべきポイントがいくつかあります。ここで提示される推奨事項は、特定の 3D コンテンツ作成ツールに限られたものではなく、さまざまなプロジェクトで活用できます。
2. スムージンググループ
スムージンググループまたはカスタム頂点法線を使用すると、エッジの硬度を定義し、モデルの外観を変更することができます。スムージンググループは、アートディレクションにより意図的に微少なポリゴン数を使用する場合に、より良い形でシェーディングを作成しやすくしてくれます。
ただ、扱いにはより繊細なケアが求められます。スムージンググループは、モデルの UV アイランド(基本的には大量のモデルの集まり)だけでなく、ベイキングを行う際に法線マップの品質にも影響を与えるものなのです。
スムージングが 3D モデルに実装されている場合は、3D ソフトウェアからエクスポートし、Unity にインポートしなければなりません。
次の画像は、オブジェクトに適用した場合のスムージングの動作を示しています。
3. メッシュトポロジー
メッシュトポロジーを使用する際は、以下のテクニックを覚えておいてください。
- 3D アセットを作成する場合は、トポロジーを適度に整ったクリーンな状態に維持してください。
- クリーンなトポロジーは、変形したり、アニメーション化するキャラクターやオブジェクトに欠かせません。
- 完璧なトポロジーを得ることにこだわりすぎないでください。テクスチャとマテリアルを適用した後は、プレイヤーまたはエンドユーザーに 3D モデルのワイヤーフレームは見えません。
次の画像は、単純なジオメトリとトポロジーを使用した岩壁メッシュのワイヤーフレームです。岩壁の外観は、マテリアルが適用されるとはるかに良くなります。
4. 形状の誇張
形状の誇張は、オブジェクトの特定のパーツを、見やすくするために普通よりも大きく表示するという技法です。ゲームに対してこれが正しいアプローチであるかどうかは、制作中のゲームのタイプとスタイルによって決まります。
モバイル端末の画面は小さいため、一部の小さい形状はキャプチャが難しいことがあります。形状を誇張することは、この問題を解決する一助となります。たとえば、小さな画面でも見やすいように、キャラクターの手を大きくします。
次の画像は、誇張した手の見え方を示しています。手、剣、体形がすべて異なる方法で誇張されています。ポリゴン数が少ないことを考慮しながら、可視性を向上させるためにこういったことが行われています。
5. メッシュの結合
レンダリングに必要なドローコールの数を減らす方法としては、Mesh.CombineMeshes() メソッドを使用して複数のメッシュを 1 つに結合するというやり方があります。すべてのメッシュのマテリアルが共通している場合は、mergeSubMeshes 引数を true に設定し、結合されたグループの各メッシュから、1 つのサブメッシュを生成します。
複数のメッシュを 1 つの大きなメッシュに統合すると、次のようなメリットが得られます。
- より効果的な遮蔽物を作成できます。
- タイルベースのアセットを、ひとかたまりの途切れのない大きなアセットとして変換できます。
この技法の手順は次のとおりです。
- 「Hierarchy」で空のゲームオブジェクトを作成し、結合するメッシュの親に設定します。
- Mesh.CombineMeshes() を実装するスクリプトを、親のゲームオブジェクトにアタッチします。
シーンの構成によっては、このメソッドの実装はパフォーマンスの最適化に効果的です。大きなメッシュは、小さいメッシュよりも視界に残りやすいため、テストして適切なサイズを確認します。
6. モデルの設定
- アニメーション化されない FBX メッシュモデルには、アニメーションデータのインポートは行わないようにする:アニメーションデータがない FBX メッシュをインポートする際は、「Import Settings」の「Rig」タブで「Animation Type」を「None」に設定します。メッシュを「Hierarchy」に配置する際にこの設定をしておくと、Unity 側で無駄な Animator コンポーネントが生成されるのを防ぐことができます。
- メッシュの読み込み/書き込みは無効にしておく:モデルがランタイム時に変更されるようになっている場合、Unity 側で変更対象のメッシュデータのコピーがメモリに常に保存され、元のモデルが保持されるようになっています。モデルをランタイム時に変更しないのであれば、「Import Settings」の「Model」タブで「Read/Write Enabled」オプションを無効にして、コピーが作成されないようにしましょう。
- スタティック/ダイナミックバッチング:スタティックバッチングは、ドローコール数を減らす一般的な最適化手法です。レンダリング時に、移動、回転、または拡大縮小しない多数の頂点で構成されるオブジェクトに対しては理想的な手法と言えます。ダイナミックバッチングは頂点が少ないオブジェクトに適したもので、バッチ処理されるオブジェクトは、レンダリング時に移動、回転、または拡大縮小しないものでなければなりません。スタティックバッチングを有効にするには、「Inspector」で「Static」をオンにします。ダイナミックバッチングは、移動する頂点が少ないオブジェクトに適しています。
7. まとめ
メッシュトポロジーの最適化、メッシュの結合、形状の誇張、モデル設定の指定は、アプリケーションのパフォーマンスを高めることができる手法です。次のチュートリアルでは、サンプルの Unity プロジェクトで LOD の使い方を見ていきます。