こんにちは。黒星ゆうです。
VRChatのアバター改変をするにあたって、アバターの負荷とか気にしたことはあるでしょうか?
パフォーマンスが同じ「Very Poor」でも、軽量化のための作業をしているかどうかで、自分や周りのプレイヤーの方々が受ける負荷はだいぶ変わってきます。
最近では便利なツールを作ってくださった方のおかげで、アバターの軽量化への敷居はだいぶ下がっていると思います。
この記事ではその「便利なツール」を活用しながら、比較的かんたんにできそうな、軽量化手順を紹介します。
ツール2点の紹介
AAO: AvatarOptimizer
非破壊でアバターの軽量化・最適化を行うことができるツールです。
メッシュを結合したり不要なものを削除したり。最近ではマスクを作成してメッシュを削除するなど、「それが非破壊改変でできちゃうの!?」みたいな機能もあります。
主にAvatar Optimizerともうひとつご紹介するツールのおかげで、Blenderを使わないでもかなりいいかんじに軽量化できます。
そんなに凝ったことをする予定がなくとも、自動である程度の最適化を行ってくれる機能があるため、とりあえず使っておくと幸せになれると思います。手軽で。
「anatawa12’s gists pack」(Avatar OptimizerのページにあるvpmリポジトリをVCCに登録すると、こちらも追加することができます)もとても便利。
この中に含まれている「ActualPerformanceWindow」を使用することで、実際にアップロードしたときのアバターのパフォーマンスを調べることができます。
非破壊改変の軽量化作業のときには欠かせないので、こちらも導入おすすめです。
TexTransTool
「非破壊テクスチャ改変ツール」です。
主にテクスチャのアトラス化やマテリアルの結合をすることができます。
デカールを貼り付けたり髪の毛をグラデーションに塗ったりもできるそうです(使ったことのない機能なので分からず……)。
「同じテクスチャを髪の毛とけもみみに使ってるけど、髪の毛を別のやつにしててけもみみしかないから、勿体ないなあ……」など、テクスチャの無駄を削減したいときによく使っています。
プレビューもできるので、「テクスチャまとめすぎておかしくなっちゃった!! があってもすぐに気づけます。
お手軽なアバター軽量化の手順
当記事執筆時点での各ツールのVersion
AAO: AvatarOptimizer:1.7.10
anatawa12’s gists pack:0.14.1
TexTransTool:0.7.7
「1アバターには1衣装」という考え方
そもそもの話ですが、軽量化をするなら「1つのアバターに入れる衣装は(なるべく)1つ」という姿勢でやりましょう。
衣装が増えれば増えるほど、そのぶんポリゴン数やTexture Memoryが増えていきます。
もちろん「どうしても着せ替えを実装したくて……!」とか、こだわりがあれば複数衣装を1つのアバターに入れても良いと思います。絶対ダメ!!! と言うつもりはありません。ぼくもたまにやります。
しかしアバターに入れるものが増えれば増えるほど、否応なしに負荷は上がってしまうということは理解しておいてください。
軽量化といえども限界はあるわけです……。
1. アバターのルートオブジェクトに「AAO Trace And Optimize」を追加する
まずは自動でそれなりに最適化してくれる「AAO Trace And Optimize」を追加します。
アバターのルートオブジェクトを選択して、Add Componentを選択します。
今回紹介するツールは基本的に、Add Componentからコンポーネントを追加して使用していきますので、ご承知おきください~。
検索欄みたいなものが出るので、「AAO」とか「trace and optimize」とか入力してあげると、「AAO Trace And Optimize」が表示されると思いますので、そちらを選択してください。
選択すると、コンポーネントが追加されて画像のような表示になると思います。
こちらは初期設定のままでおおむね問題ないかと思います。
2. GameObjectを作成して、「TTT Atlas Texture」を追加する
アバターのルートオブジェクトを右クリックして、「Create Empty」を選択します。
名前は「TexTransTool」とか「AtlasTexture」など、自分で分かりやすいように設定してください。
追加したGameObjectに、Add Componentから「TTT Atlas Texture」を追加します。
「ターゲットルート」にアバターのルートオブジェクトを入れてください。
そうすると、アバターに含まれているマテリアルが一覧表示されます。
非アクティブなオブジェクトのマテリアルも表示したいときは、「アトラス化設定」の「適用時に非アクティブなレンダラーを含める」にチェックを入れます。
(AtlasTextureの対象に含まれているマテリアルを使っているオブジェクトが非アクティブのままで、アップロードを行うと表示がおかしくなることがありますので、特にこだわりがなければチェックを入れておくのがオススメです)
「TTT Atlas Texture」は、選択したマテリアルのメインテクスチャをアトラス化して、1枚のテクスチャにまとめてくれます。
「1枚のテクスチャを髪の毛とけもみみに使ってるけど、けもみみにしか使ってないから勿体ないなあ……」など、テクスチャの無駄を削減することができます。
先ほどのTTT Atlas Textureの画像内容の設定で、使用前後のTexture Memoryを比較してみます。
VRChat SDKのBuilderに表示される情報は、あくまでAvatar Optimizerなど各非破壊ツールが動作する前の情報です。
実際にアップロードした際の情報を確認できないため、ここではanatawa12’s gists packのActualPerformanceWindowを使用します。
画面上部のツールバーで、Tools→anatawa12’s gist selectorを選択し、その中にある「ActualPerformanceWindow」にチェックを入れれば使用可能です(Apply Changesを押すのを忘れずに!)。
こちらを選択した状態でPlayモードにすることで、実際にアップロードしたときの情報が見れるわけです。
(画面上部中央の再生ボタンを押すとPlayモードにできます)
そうして実際に見てみた結果が↓になります。
だいたい10MBくらい減ってますね!
とはいえテクスチャを圧縮する都合上、多少見た目の劣化は発生するので、いい感じの塩梅で調整してください。
テクスチャをまとめるだけでなく、マテリアルそのものを1個にまとめることもできます。
が、たとえば「不透明」なマテリアルと「透過」なマテリアルを結合してしまうと、どちらかに統一されてしまうので、「透過したいところが透過されてない!!」などといった不具合が発生します。
マテリアルの結合は、その都度プレビュー機能を使いながら確認したうえで設定するのをおすすめします。
まとめ
今回は比較的かんたんにできそうな軽量化手順、というテーマで紹介いたしました。最低限これをやっておけば、とりあえずそれとな~く軽量化できるかな、といったものです。
実際ぼくも普段改変するとき、こだわりがなければやっているのはこの程度です。
他にも軽量化できる活用方法はあるのですが、それは別記事で書きます。いっぺんにいろいろ書いても読み切れないかもしれないため。
そんなに手間がかかりすぎることはないと思いますので、ぜひお試しください~!