ウーパの手習い

私的開発メモ用途なのでご容赦ください。2020年現在はSwiftとUnityでARのお勉強中。

Unity: Mesh Baker を使ってみる

f:id:uuupacom:20180331163845p:plain

これからいろいろ書きますが、Mesh Bakerについて私が「あ、そうだったの!」と知ったことは以下の2点です。

  • Mesh Baker で統合させたいオブジェクトは、そのマテリアルに応じて取捨選択する必要がある
  • Mesh Baker は統合前のオブジェクトを壊したり消したりしないので、元に戻したければいつでも何度でも元に戻せる

以降、それをふまえて、私が Mesh Baker を使ってみたレポートとなります。

Mesh Baker とは

assetstore.unity.com

Unityに配置した各オブジェクトのマテリアルやメッシュをそれぞれひとまとめにすることで、ポリゴン数の減らしたり、SetPass Callsを減らしたりして、描画負荷を軽減するための便利なアドオンツールが「Mesh Baker」です。

すでに試されて記事にされてらっしゃる方も多く、操作手順などを記事から勉強させていただきました。

www.crossroad-tech.com

qiita.com

※他にも良記事がありますが、年月とともにMesh Bakerの操作インターフェースが多少変更されているので、できるだけ最近の記事を読ませてもらうのがいいでしょう。

さて、詳細は上の記事で解説されておりますが、大雑把な作業フローとしては

  1. 統合したいオブジェクト達を空オブジェクトの中にまとめておく
  2. マテリアルを統合する。統合されたマテリアルがProjectパネルに新規作成される
  3. メッシュを統合する。ひとまとまりにメッシュ統合されたオブジェクトがHierarchyパネルに追加される
  4. Hierarchyパネル上にはベイクする前のソースオブジェクトがそのまま残っているので非表示にする。
  5. (ライトをベイクしなおす)
  6. ポリゴン数、SetPass Calls数が軽減されて万歳~!

という使い方になります。

とりあえず適当に試してみた

私がVRChat用ワールドとして製作した ATL広尾を再現したワールド

を対象に、Mesh Bakerを使ってみます。Mesh Bakerの仕様に従い、64kポリゴン以上を統合したいので、私は有料版を購入しています。

まずは深く考えず、下記のビデオのとおり、マテリアルとメッシュを持っているオブジェクトをまとめて指定して、Mesh Bakerを使ってみました。

youtu.be

結果は大失敗なのですが、Mesh Bakerを使うにあたって、配慮すべき事柄が分かりました。 

  • 壁や床のように、マテリアルをタイリングして繰り返し敷き詰めているオブジェクトはMeshBakerの対象外にした方が良い
    ※Mesh Bakerの設定をいじらなければ、タイリングされているオブジェクトは勝手に除外してくれる
  • 照明器具の発光部分の光が消えてしまった:emmitionマップを持っているマテリアルを設定したオブジェクトは対称から外した方が良さそう
  • ガラスが真っ黒になってしまった:アルベド(画像)マップのアルファ情報を使って透明を表現しているマテリアルを持つオブジェクトは対象から外した方がよさそう
  • 木の枝葉部分が板ポリゴン表示になってしまった:これもアルベドのアルファ情報を使ってマスク(アルファテスト)しているので、ガラスと同じく対称から外した方がいい
  • そもそも木は両面ポリゴン表示するために独自シェーダーを用いているので、対象外にしたほうがいい
  • 一番厄介なのは、パソコンデスクを例にとると、デスク上にモニタやキーボードが置かれているデスクと、置かれていないデスクがあり、置かれていないデスクの卓上に、モニタやキーボードの影だけが表示されている症状がみられた。このように統合後にライトをベイクした後、影の具合がおかしいという症状は、どういう場合に発症するのかが分からないのがすごく厄介。
  • その他、マテリアルのMetallicやAOのパラメーターを個別にいじっている場合、統合マテリアルではその値が1に戻ります

さらに何度も Mesh Bakerを使ってみる

上の事項、特に影の表示については、ライトをベイクしないと確認できないこともあって、いちいち時間がかかりますが頑張って、どのオブジェクトは Mesh Baker の対称にして、どのオブジェクトは対象にしないかをチェックしていきました。

救いとしては、Mesh Bakerは非破壊性のアドオンだということです。Mesh Bakerを使うことで、統合されたマテリアルと統合されたメッシュオブジェクトが生成されますが、元のマテリアルとオブジェクトも消されることなくそのまま残っていますので、Mesh Baker の結果が気に入らなければ、生成された統合マテリアル&メッシュ&Mesh Baker オブジェクトを消去してやれば、何度でも最初からやり直せるのです。

f:id:uuupacom:20180331161107p:plain

図のハイライト要素を消去してやれば元通り!

最終的に

統合すべきオブジェクトを厳選して、最終的に以下のビデオのようになりました。

youtu.be

ここまで書いてきた通り、すべてのメッシュオブジェクトを対象にはせず、厳選した結果、対称としたのは以下のオブジェクトです。これらのマテリアルとメッシュをひとまとめにしたわけです。
※正確には64kポリゴン以上なのでMultiMeshBakerを使って3つにまとまりました。

f:id:uuupacom:20180331162456p:plain

結果、ポリゴン数は変わらず、SetPass Calls数は165から95に軽減されました。これを部分的に画質下がったけど大分減らせたから良しと考えるか、これならMesh Baker導入しなくてもいいかと考えるか、正直判断難しいところです。

他の方の記事の使用例では、AssetStoreのサンプルをソースにしてすごい軽量化されている事例も紹介されていますが、私の場合は、もともとSetPass Calls 数がそこまで多くなかったこともあり、絵のクオリティと負荷軽減との釣り合いをどこでとるかが悩ましいです。

以上、Mesh Bakerを使ってみたレポートでした。

おまけ:マニュアル

マニュアルを読んでみて、気になった箇所を意訳&記載しておきます

おすすめのワークフロー

  1. シーンにMeshBakerオブジェクトを追加する
  2. Open Tools For Adding Objects ボタンをクリックして、List Shaders In Scene をクリック。グループごとにMaterialBaker/MeshBakerオブジェクトを作ることができる。(メモ:私はこの方法ではなく、ヒエラルキー上で選択した親オブジェクトをAddして統合対象のリストに追加する方法を採用しています)
  3. 任意で、既存のメッシュやTextureBaker(結合済)メッシュを追加することもできる。Search For Meshers To Add タブを使う
  4. マテリアルとメッシュをベイク(=結合)する
  5. 結合前の不要になったオブジェクトをdisableにする。ソースとなったオブジェクトを変更した場合は再度ベイクする

ソースオブジェクトにコライダーやスクリプトが設定されている場合は、ソースオブジェクト自体はそのままにしておき、そのメッシュレンダーのみをdisabledにしてやれば良い。

サブメッシュを持つオブジェクトについても説明がされているが、私はサブメッシュ構造のオブジェクトは作っていないため読んでおりません。

その他オプション設定に関して

  • 0~1以上のUV範囲を使っているオブジェクト、つまりテクスチャをタイリングして使っているようなマテリアル(僕の場合、壁や床はタイリング、つまり繰り返し敷き詰める使い方をしている)は、MeshBakerの対象から外した方が良い。MeshBakerでも一応のサポート機能(Consider Mesh UVs)はあるが、最適化観点からはおすすめしないそうなので、対称外にする方が良いだろうと私は思います。
  • Lightmappingとの関係性については、generate_new_uv2_layout設定が推奨となっている。この設定にした場合は、結合されたメッシュが生成された後に、再度ライトをベイクすればよいので、とくに不便もない。
  • ソースオブジェクトが64kを超える場合はMultiMeshBakerを利用する。
  • ベストプラクティスとしては、同じシェーダーで、全てのテクスチャプリセットが設定されていて、マテリアルはオブジェクトに1つだけ割り当てられており、各テクスチャサイズが同じであるような状態のオブジェクトを結合すると良いとされている(メモ:サイズ同じ?マジで?)

以上です。