見出し画像

ドローコールは一度だけ

前書き

 前略、メリークリスマスなシーズンにお届けいたします。Najikoです。今年もアドベントカレンダーの季節がやって来たというわけですね。不肖わたくしはあんふぃとらいと氏が送るあんふぃとらいと Advent Calendar 2021にて12月16日を担当させていただいておりますのでこちらに記事を書いています。色々あったので今年はnoteで勘弁してください。

概要

 結論から申し上げましょう。今回はアバターのQuest対応の記事です。
やることは全部で2つです。
1.アバターをVRCQuestToolsに通してQuest向けの状態にする
2.にゃんにゃんメッシュエディターで最適化を行う

準備

 まずVRCQuestToolsにゃんにゃんメッシュエディターをboothでダウンロードして、Quest対応したいアバターのプロジェクトにインポートしましょう。VRCQuestToolsはインポート時に「ASTCでテクスチャを圧縮する」と書いたボタンのあるウィンドウが表示されるので、クリックします。では早速取り掛かっていきましょう。

ここで趣旨

 ここは理屈の話なので読み飛ばしてもらっても結構です。淡々と書いていますが、実はQuest対応するだけならVRCQuestToolsを通せばそれで完了してしまいます。その後にゃんにゃんメッシュエディターを使う理由とは何か。
「そうか、ポリゴン数を削減するんだ!」
と思った方。ブッブー、です。確かににゃんにゃんメッシュエディターの本来のメイン機能はそちらの方なのですが、今回はやりません。理由は二つ。面倒だから、そして手間に見合わないからです。
 Quest向けのパフォーマンスではポリゴン数も厳しい制約が課されています。具体的には2万ポリゴンを超えるとVeryPoorに。もちろん従うに越したことはないのですが、実際にはポリゴン数は極端な多さでなければマシンに甚大な負荷をかけることはありません。
 ですが、ポリゴン数とは違って多くなると露骨に負荷(描写ではなく読み込みの方ですが)をかける要素があります。それがメッシュとマテリアルスロットの数です。まず、CPUが描写処理を呼び出すことをドローコールと呼びます。ここで、CPUくんの気持ちになって実際に考えてみましょう。
 あなたはCPUです。今、描写範囲にオブジェクトが1つ現れました。するとオブジェクトは「この通りに描写してね」と、マテリアルとメッシュの情報を渡してきました。そのオブジェクトはメッシュもマテリアルも1つずつのみのオブジェクトだとします。あなたはそれを読んで内容を理解し、GPUくんに渡します。GPUくんは渡されたとおりにオブジェクトを描写します。マテリアルさえ複雑な内容でなければまあ、簡単なお仕事に思えるのではないでしょうか。
 しかし、今度は描写範囲にメッシュが10個、マテリアルも10個のアバターが登場しました。アバターは「この通りに描写してくれよな」と10個のマテリアルの情報と10個のメッシュの情報をそれぞれ渡してきます。それをあなたは全部読んで理解し、このマテリアルはこのメッシュ、このマテリアルはこのメッシュで……と、GPUくんに情報を渡します。GPUくんもまた「うわ、急に10個ずつ渡してきたよ」と思いつつも頑張って描写してくれます。大変ですね。これが聖徳太子ばりのマルチコアを持つハイスペックなPCのお仕事であればどうとでもなるかも知れません。しかし、Questくんはそんな強力なプロセッサは持っていませんから、描写範囲を出入りするたびに10個も20個もドローコールを走らせていたら「ウワーッッッ!!!!」となってしまうこと請け合いです。それがさらにインスタンスに10人20人といたら……なんとブラックな労働環境でしょう。
 ですが、メッシュのポリゴン数はどうであれこれが1つに統合されていたら。最初の例のようにQuestくんでも笑顔で働けるお仕事になるに違いありません。今回は単にアバターをQuest向けにアップロードすることに加えてそこを目指してみましょう。

手順

 まずはPC向けのアバターをVRCQuesToolsでQuest向けに変換します。

ヒエラルキー上でPC向けのアバターを選択した状態でVRCQuestToolsのConvert Avatar for Questを使用します。

このようなウィンドウが表示されます。とりあえず下の変換ボタンを押します。すると、テクスチャを圧縮生成して全てのメッシュにVRCMobileToonLitのマテリアルをあてがい、Quest非対応コンポーネントをすべて削除したアバターが新たにヒエラルキー上に生まれます。

この時、FXレイヤーにマテリアルを変更するアニメーションが含まれていた場合、FXレイヤーも複製して適用してくれます。ある場合は新しく生成されたアバターのFXレイヤーを開いて当該のレイヤーを削除しましょう。

こちらは新たに生成されたアバターです。(Quest)と名前についていますね。この状態で既にQuest向けにアップロードすることが可能ですが、上の画像の通りこのアバターには10のメッシュが存在しています。これを統合します。

次ににゃんにゃんメッシュエディターを起動します。にゃんにゃんメッシュエディターはUnity上で簡易的にメッシュを編集するアセットです。名前に反してパワフルな機能を備えています。Windowタブから起動していきます。

起動するとこのようなウィンドウが出ます。上のボックスに編集したいアバターをヒエラルキーからドラッグアンドドロップし、その下のSet upボタンを押してセットアップを開始します。

起動したら左下にある「Save Option」タブを開き、画像の通りCombine MeshとCombine Materialにチェックを入れます。それぞれCombine All MeshとBy Shaderを選択し、下のExportボタンを押して新しいメッシュを保存します。すると……


当該のアバターの階層の一番下の部分に「Body_Edit」というメッシュが生成されていますこれが全てが統合されたメッシュです。この状態だと表示が変ですが……

元々あったメッシュを非表示にするとこの通り、全て統合されたメッシュが正常に描写されている様子が分かりますね。

元々あったメッシュを削除し、統合されたメッシュの名前を顔のメッシュに合わせて今回は「Body」とします。こうすることで表情アニメーションが統合前と同じように動きます。もし「Body」以外のメッシュのBlendShapeを使用したアニメーションを実装していた場合は作り直しましょう(すべてのメッシュのBlendShapeは統合後のメッシュに含まれています)
また、この時点で全てのテクスチャがAtlas化され、マテリアルスロットも1つになっていることが確認できました。

ここまでできたらビルドセッティングをAndroidに切り替えてSwitch Platformを押し、Androidビルド状態でQuest用にアバターをアップロードします。BluePrintIDはPC用アバターと同じにしましょう。

あ、忘れてました。統合後はリップシンクのFace Mesh欄の参照が外れていると思うのでドラッグアンドドロップしてリップシンクを有効にしましょう。

VRCSDKを起動するとこのようになっています。ポリゴン数とボーンの数はともかくとして、Skined Mesh Renderersが1、Material Slotsも1になっていることがわかります。これでアップロードすれば「ドローコールは一度だけ」のアバターの出来上がりです。

おわりに

 ザッカーバーグ氏の策略により今Quest2がバカ売れしています。Quest単機でVRCに入ってくるユーザーもますます増えていくことが予想されます。ぜひこの記事を参考に、Questユーザーにやさしいアバターを使って差し上げて下さい。わたくしもたまにQuest2単機で入るので喜びます。では、年末はQuest向けワールドでわたくしと一緒に年越ししましょう。怱々。

この記事が気に入ったらサポートをしてみませんか?