BlenderとUnityで作ったものをVR(Meta Quest/Oculus Link)で動かします

ブログの女の子を作る #38 テクスチャベイクとマテリアル共有でUnityの負荷を下げる【Unity】

 
前回の記事では、メッシュ結合とオクルージョンカリングを使って、Unityで作った街の負荷を下げることができました。
 
ステージの負荷はかなり下がりましたが、キャラクターの負荷は変わっていません。このステージでキャラクターをたくさん表示してみたいので、1体あたりの負荷は低い方がありがたい。
ネットで調べてみると、負荷を下げる方法がいろいろありました。
 
この記事では、以下の3つの方法を試してみました。
(1) Blenderのテクスチャベイクで複数のテクスチャを1枚にまとめる
(2) Unityでテクスチャサイズを変更・圧縮する
(3) 1つのマテリアルを複数のオブジェクトで使う
 
どの方法も効果があったようですよ。



(1) Blenderのテクスチャベイクで1枚にまとめる

いまのキャラクターは、かなり多くのマテリアルを使ってます。
オブジェクトを作るたびにマテリアルを作ってきた結果なんですが、Unityで動かした時はマテリアル数が少ないほど負荷が下がるようです。
 

チェック柄のスカートのマテリアル数が多い

Blenderで、これまでに作成した3Dモデルを調べてみると、チェック柄のスカートで色ごとにマテリアルを作成してるのが気になりました。
 
きれいなチェック柄になったのは良いんですが、その弊害として、マテリアル数とメッシュ数が増えてしまいました。作った時はあまり気にしてませんでしたが、どうやら負荷が高くなる要因になっていたようです。
このスカートの場合、5つのマテリアルが設定されてますね。
・スカートC1_1(紺色1)
・スカートC1_2(紺色2)
・スカートC1_3(紺色3)
・スカートC1_4(白色)
・スカートC1_5(朱色)
 
まずは、このマテリアル数を減らしていきます。
 

作業前にStatisticsの数値を確認する

作業後に「どれくらい負荷が下がったか」を確認するために、作業前の Statistics を確認しておきます。
キャラクター単体の数値を確認したいので、Terrainや建物などは一時的に消してます。
 
・Batches: 107
・SetPass calls: 74
・Shadow casters: 36
 
この数値がどれくらい下がるか楽しみです。
 

UV展開して画像ファイルを保存する

このスカートを作成した時は、チェック柄のメッシュ部分に単色のマテリアルを割り当ていましたので、UV展開をする必要がありませんでした。これからは1枚のテクスチャ画像になりますので、UV展開しておくのが良さそうです。
 
スカートのオブジェクトを選択して、編集モードに切り替えた後、「UV Editing -> UV -> 展開」を実行します。
 
UV展開後、スカートの位置と大きさを良い感じに調整しておきます。
スカートを大きめにしてみました。
 
UV Editing -> 画像 -> 保存」で画像ファイルを保存しておきます。
スカートC1_tbk.png」というファイル名で保存しました。
 

Shadingで画像ファイルを追加する

画面上部のメニューバーで「Shading」をクリックします。
 
次に、「追加 -> テクスチャ -> 画像テクスチャ」をクリックして、「画像テクスチャ」のノードを追加します。
 
追加したノードを適当なところに移動して、「開く」をクリックします。
 
先ほど作成しておいた「スカートC1_tbk.png」を選択します。
 
ノード内に、選択したファイル名が表示されてますね。
これで「画像テクスチャ」ノードが設定できました。
 

すべてのマテリアルに「画像テクスチャ」ノードをコピーする

先ほど追加した「画像テクスチャ」ノードを「コピー」して、他のマテリアルに貼り付けていきます。
 
画面右側の「マテリアル一覧」から別のマテリアルを選択して、「貼り付け」ですね。
この作業をすべてのマテリアルに対してやっておきます。
このスカートの場合、「スカートC1_2」から「スカートC1_5」の4つに貼り付けました。
 

削除してつないでおく(おまじない)

ここで、「おまじない的な設定」を一つやっておきます。
 
元からあるノード「プリンシプルBSDF -> ベースカラー」と隣接するノード「既存の単色画像テクスチャ -> カラー」の接続を削除します。
 
接続が無くなりました。
 
再度、同じ状態になるようにつなげておきます。
削除してつなぎ直すだけ」なんですが、なぜか私の環境ではこれをしないとダメでした。
 
この操作をしない場合、ベイク後のテクスチャがおかしくなってしまいます。
ベイクできてるようにも見えますが、実際には1~2個のテクスチャしか使われてないのと、画像がとても粗い状態になってます。何が原因なんでしょうね。
 

選択してベイクする

最後の設定として大事なのが、「追加した画像テクスチャを選択しておく」です。
 
画像テクスチャのノードをクリックすると、ノードの周りに「白い線」が表示されます。
これが「選択している」状態です。
 
すべてのマテリアルで同じように選択状態にしておきます。
 

テクスチャベイクする

これで一通りの設定が完了しました。
 
画面右側にある「レンダープロパティ」タブをクリックし、「ベイク -> ベイクタイプ」で「ディフューズ」を選択します。
 
「影響」欄で、「査接照明」と「関節照明」を未選択状態にして、「カラー」だけが選択されている状態にします。
 
そして、「ベイク」ボタンをクリックすると、ベイク処理が始まります。
 
もし、「Object “オブジェクト名” is not enabled for rendering」みたいなエラーメッセージが表示された場合は、ベイク対象のオブジェクト(今回はスカート)で「レンダーで無効」という箇所にある「カメラのアイコン」がオン状態になってるかを確認しておきましょう。これがオフになってるとベイクできません。
 

5枚のテクスチャが1枚になった!

しばらく待つとベイク完了です。
 
テクスチャベイク後の画像が表示されてますね。
なかなかきれいにベイクできてます。忘れないうちに画像ファイルを保存しておきましょう。
 
画面左上の3本線アイコン -> 画像 -> 名前を付けて保存…」です。
 
名前は「スカートC1_tbk.png」です。
 
画像ファイルをビューアで見てみました。
UV展開したメッシュの形に沿って、テクスチャ画像がベイクできてるのが分かります。
 
このテクスチャ画像を自分で描くことができていたら、ここまで面倒な手順は必要なかったんですけどね。。。結果的には、キレイな画像がゲットできたので良しとしましょう。
 

失敗した時は再度設定をやり直してみる

こんな感じでテクスチャベイクをやっていくんですが、先ほどお見せした画像のように失敗することがあります。
これでしたね。
 
そんな時は設定を確認したり、再度設定しなおしたりすると成功することが多い。特に、「ノード間の接続を切って、再度つなぎなおす」はベイクする直前にやった方が良い気がしました。なんとなくですが。
 

既存のマテリアルを消して新規作成する

これまでに使ってたマテリアルは必要ありませんので削除します。
 
真っ白になりました。
 
次に、「新規」ボタンをクリックして新しいマテリアルを作成し、わかりやすい名前をつけておきます。
 
画像ファイル名と同じく、「スカートC1_tbk」にしてみました。
 
ベースカラー」の右側にある「丸いアイコン」をクリックして、「画像テクスチャ」を選択します。
 
開く」をクリックします。
 
テクスチャベイクで作成した画像ファイル「スカートC1_tbk.png」を選択します。
 
新しいテクスチャ画像が反映されました!
 
このスカートの場合、艶は必要ないですので「スペキュラー」を 0 にしておきます。
 
拡大してみます。
少しドットが見えますね。UV展開時に保存した「画像の解像度」を上げればドットが小さくなるとは思いますが、これくらいなら大丈夫でしょう。
 
最後に、FBXファイルにエクスポートしておきます。
これで、Blender側での作業は完了です。
 

FBXファイルと画像ファイルをインポートする

ここからはUnity側での設定になります。
 
FBXファイルをUnityで読み込み直しした後、Blenderで作成した画像ファイル「スカートC1_tbk.png」をインポートします。
私の環境の場合、textureフォルダにテクスチャ画像をまとめてますので、このフォルダに画像ファイルをD&Dしました。
 

マテリアルを作成してシェーダーを設定する

Unityの「Project」で「Create -> Material」を選択し、新しくマテリアルを作成します。
マテリアル名は「スカートC1_tbk」にしました。
 
作成したマテリアルを選択し、Inspectorでシェーダーを設定します。
他のオブジェクトと同じく、「VRM/MToon」を使いました。
 

マテリアルに画像ファイルを設定する

シェーダーにテクスチャ画像「スカートC1_tbk.png」を設定していきます。
 
VRM/MToon」の場合、「Color -> Texture -> Lit Color, Alpha」と「Shade Color」の2か所にある「小さな丸いアイコン」をクリックすると、画像ファイルを選択する画面が表示されます。
画像ファイルを選択しておきます。
 
次に、キャラクターのPrefabを「Project」で選択した後、先ほど設定した「スカートC1_tbk」マテリアルを「キャラクターのInspector – Materials – Remapped Materials」にD&Dします。
 
最後に、設定を保存しておきます。
 

Magica Clothを再設定する

これで設定完了なんですが、この状態でUnityを動かしてみるとスカートの挙動がおかしい場合があります。
テクスチャがずれてる感じですね。
 
そんな時は、Magica Cloth設定で「Create」ボタンを再度押すと直ります。
これで大丈夫でしょう。
 

スカートの描画負荷が下がった!

Unityを動かした時の「Statisticsの値」を確認してみます。
 
・Batches: 107 → 8720減った
・SetPass calls: 74 → 6212減った
・Shadow casters: 36 → 288減った
 
平均すると、20%くらいの削減に成功したようです!
 
Unity上での挙動も問題なさそう。
良かったですよ。
 
これまで使ってたマテリアルはもう使いませんので、削除しておきましょう。
 
見た目はほとんど同じで、描画負荷だけが下がる」のはとても良いですね。
 

別のスカートもやっておく

同じ手順で、別のスカートもテクスチャベイクした画像に変更してみます。
 
まずは変更前の状態です。
・Batches: 97
・SetPass calls: 68
 
Blenderでのマテリアル数は「3個」です。
 
テクスチャベイクできました。
 
Unityで動かしてみましょう。
 
・Batches: 97 → 8710減った
・SetPass calls: 68 → 626減った
・Shadow casters: 32 → 284減った
 
平均すると、11%くらいの削減でしょうか。削除したマテリアル数が多いほど、効果が高いようですね。
 

(2) Unityでテクスチャサイズの変更と圧縮する

テクスチャ設定を見ていると、テクスチャ画像が使ってる容量が大きいことに気づきました。
 
ネットで調べてみると、設定変更でテクスチャサイズの変更と圧縮設定を調整するだけで、簡単に小さくなるらしい。使用メモリ削減にもつながりそうなのでやっておきましょう。
 
サイズと圧縮設定で画像の見た目が変わるので、いろいろ試して良い設定を探してみます。
 

1. 最初の状態(2048px)

・Max Size:2048
・Resize Algorithm:Mitchell
・Format:RGBA 32 bit
・サイズ:2048×2048 RGBA8 UNorm 21.3MB
 
最初の状態です。サイズが 21.3MB とかなり大きいです。
 

2. 半分にしてみる(1024px)

・Max Size:1024
・Resize Algorithm:Mitchell
・Format:RGBA 32 bit
・サイズ:1024×1024 RGBA8 UNorm 5.3MB
 
サイズは1/4になりましたが、画像がすこしぼやけてます。ギリセーフな感じ。
 

3. 更に半分にしてみる(512px)

・Max Size:512
・Resize Algorithm:Mitchell
・Format:RGBA 32 bit
・サイズ:512×512 RGBA8 UNorm 1.3MB
 
サイズは更に小さくなりましたが、画質が悪くなりすぎました。やりすぎですね。
 

4. 2048pxで圧縮あり(1/100に)

・Max Size:2048
・Resize Algorithm:Mitchell
・Format:Automatic
・Compression:Normal Quality
・Use Crunch Compress:チェックあり
・サイズ:2048×2048 RGBA Compressed DXT5 UNorm 272.5KB
 
試しに画像サイズは2048pxのままで、圧縮をかけてみると 21.3MB → 272.5KB1/100くらいになりました!圧縮すごい。
見た目がほとんど変わらないのもうれしい。
 

目のテクスチャ(かなり減った)

その他のテクスチャもサイズや圧縮をかけた時の見た目を確認しつつ、設定しておきます。
 
・Max Size:1024
・Resize Algorithm:Mitchell
・Format:Automatic
・Compression:Normal Quality
・Use Crunch Compress:チェックあり
・Compressor Quality:50
・サイズ:1024×1024 RGB Compressed DXT1 UNorm 33.2KB
 
5.3MB → 33.2KB になりました。かなり減りましたね。
 

体のテクスチャ(激減した)

・Max Size:512
・Resize Algorithm:Mitchell
・Format:Automatic
・Compression:Normal Quality
・Use Crunch Compress:チェックあり
・Compressor Quality:50
・サイズ:512×512 RGBA Compressed DXT5 UNorm 28.1KB
 
21.3MB → 33.2KB に激減しました。使ってる色数が少ないと効果も高いですね。
 

吊りスカートのテクスチャ(1/30に)

・Max Size:512
・Resize Algorithm:Mitchell
・Format:RGB 16bit
・サイズ:512×512 B5G6B5 UNorm 0.7MB
 
21.3MB →0.7MB で1/30になりました。
 
このテクスチャ画像の場合、圧縮をかけるとなぜか画質がかなり悪くなったので、非圧縮にしてみました。その代わりに「RGB 16bit」で色数を減らすことでサイズを減らしてます。
 
チューニング作業はなかなか楽しいですね。
 


(3) マテリアルの共有で SetPass calls を下げる

これまでの作業で、テクスチャベイクでマテリアルの数を減らし、テクスチャ画像のサイズや圧縮を行ってきました。
 
マテリアル数を減らす別の方法として「1つのマテリアルを共有して使いまわす」という方法があるようです。
ちょうど良いオブジェクトがあったので試してみました。
 

「白い単色のマテリアル」が複数あった

ワンピースのリボン、ワンピースの線、目のハイライト」はどれも単色の白色なんですが、マテリアルを個別に作ってました。
何も考えずに別名で作ってたようですね。
 
設定変更前の Statistics です。
 
・Batches: 96
・SetPass calls: 65
数値が下がると良いのですが。
 

「白テクスチャ」1つにまとめる

別名になってたマテリアルをすべて削除し、「白テクスチャ」という単色のマテリアルに変更しました。
 
Unity側でも設定変更しておきます。
 
この状態で動かしてみましょう。
 
・Batches: 96(変わらず)
・SetPass calls: 65 → 569減った
 
ワンピース服を着た状態では、SetPass callsが 14% 減りました!
 

まとめ 

テクスチャ(マテリアル)の数を減らすことで、Unityで動かした時の負荷を下げることができました。
 
Blenderでモデリングしてる時には気づきませんでしたが、マテリアルの使い方でかなり負荷が変わってくることが分かりましたよ。今後新しくオブジェクトを作る時は、できるだけ負荷が低くなるように気を付けてみたいと思います。
 
スポンサーリンク

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。

ブログの女の子を作る #37 Unityの街をMesh Bakerとオクルージョンカリングで軽くする【Unity】

ブログの女の子を作る #39 オブジェクトの頂点数を減らしてUnityの負荷を下げる【Unity】


最近のコメント

だーしゅ
IT関係のお仕事してます。
3Dモデルの女の子は「ブログノ・スージー」。VRは楽しいですね。

[当ブログについて]