メインコンテンツまでスキップ

ビルド時の自動最適化はどう動作するのか

このページは説明です。今すぐアップロードしたい場合は VRChat を見てください。

一行でまとめると​

自動最適化は既定でオンになっています。皆さんがすることはありません。

アップロード・ビルドのコピーを軽くし、作業用のマテリアルは編集できる状態に戻します。

変換ウィザードが作った MingToon のコピーにも、この処理はそのままかかります。ウィザードの最後にオンにするものはなく、アップロードする対象は元ではなくコピーです。

きちんとかかったか確認する​

  1. ConsoleのC#・シェーダーエラーを0件にします。
  2. StudioRaming > MingToon > Validate Project で環境条件を確認します。
  3. ビルドログで候補数・スワップ数・顔ノーマルのベイク数を確認します。
  4. プロジェクトフォルダーの横の StudioRaming/MingToonOptimizeReport.txt を開きます。
  5. VRChatの場合は、自分の画面・ミラー・Photo Cameraをそれぞれ確認します。

VRChatプロジェクトでは、Consoleに [MingToon] VRChat build hook compiled and registered. がセッションごとに1回出ます。

MingToon Manager の軽量化タブでアップロード時の自動最適化の設定カードが見える画面

どこでオン・オフを切り替えるか​

MingToon Manager の 軽量化 タブの アップロード時の自動最適化 カードに3つすべてがあります。

項目既定値機能
ビルド・アップロード時に自動最適化(全体共通)オンこの機能全体をオン・オフします。キャラクター単位の設定ではなくエディター全体にかかる1つのスイッチなので、ここでオフにすると他のキャラクターのアップロードでもオフになります
プレイモードでもビルド・シェーダー・メッシュフックを許可(オプトイン)オフPlay モードでも、ビルド・シェーダー・メッシュ処理のフックを走らせます
アップロード時もテクスチャ再書き込み(オプトイン)オフレビュー済みのテクスチャ再加工を追加で許可します

1 つ目をオフにすると、その下の2つのオプトインのトグルはカード上でたたまれます。オンに戻すと再び出ます。

開始 タブの アップロードの準備 セクションには、同じスイッチの現在の状態(オン / オフ)だけが出て、切り替えるトグルはありません。切り替えるには、その隣の 軽量化タブで変更 を押します。

アバターごとに方式も選びます。 このアバターのビルド・アップロード最適化方式 は 軽量化 タブの一番上のカードにあります。

方式いつ
FastUpload(推奨)既定値です。共有シェーダーを使ってアップロード時間を短縮します
Legacy GPU 精密最適化マテリアルごとに個別にベイクする従来方式が必要なときにだけ

手動ベイク(アップロードのプレビュー)の方式は別で、見た目 タブの 軽量シェーダーベイク(エディター専用) で選びます。→ 手動Bakeと復元

何が起きるのか​

  1. 出荷対象のRendererとAnimationClipが参照するMingToonマテリアルを集めます。
  2. 実際に使う機能とアニメーションされる値を分析します。
  3. 固定機能を定数に畳んだ軽量シェーダーを作るか、キャッシュから取り出します。
  4. 出荷の間だけ、マテリアルのシェーダーを軽量版に差し替えます。
  5. プラットフォーム別の追加処理を実行します。
  6. 終了・失敗・ドメインリロードのいずれかが起きたら、元の状態に戻します。

生成シェーダーは編集用と同じプロパティ契約を維持します。

ビルド中だけ変わる値は定数へ畳みません。 成功したビルドは生成プロファイルとソースキャッシュを記憶し、同じアバターの次回ビルドで再利用します。 キャッシュが温まった後の体感差は、シーンとシェーダーキャッシュの環境によって変わります。

異なるマテリアルの共有範囲​

**FastUpload(推奨)**は現在のビルド内のマテリアルを対象に共有を計画します。レンダー状態と必要なパスが合うグループを作り、共通かつ外部アクセスに対して安全な値だけを定数化します。異なる色・テクスチャ・設定はマテリアルに残し、アバターごとの違いを保持します。

この計画は1回のビルド単位です。別々にアップロードしたアバターのシェーダーまで自動的に統合しません。異なるアバターの群衆で GPU 時間・描画数・メモリがどれだけ減るかは別の実測が必要です。

VRChatアバターで追加される処理​

  • 深度の可用性 の値をそのまま残します。AutoはAutoのまま出荷されます。
  • 顔ノーマルをアップロード用コピーのMeshのUV7にベイクします。
  • Face SDFがUV7を使うRendererは、同じ結果になるようLive経路を維持します。
  • スロット種別ごとのテクスチャ解像度上限を、合成・パッキングで作った出力に適用します。
  • VRC Light Volumesのバリアントを自動でオンにします。
  • 手動ベイクとアップロード前にマスク入力レシートを準備し、未準備の入力はそのマスク最適化だけをスキップします。
  • MingToonのランタイムコンポーネントを IEditorOnly として表示します。削除は保証されません。

顔ノーマルのアップロード成果物は、編集用のメッシュベイクとは別の経路を使います。編集用のMeshを上書きすることはありません。

アニメーションされる値には触れません​

アナライザーはAnimationClipとAnimator Controller、コンポーネントの入れ子フィールドをたどります。ランタイムでオンにする機能は、インスペクターのオプトインをオンにしないと定数に畳まれます。

  • FXアニメーターで深度エフェクトを切り替え
  • FXメニューでシャドウ投影を切り替え
  • VRCランタイム操作を使う

オプトインは切り替えの余地を残す代わりに、関連するコードも残します。実際に変更するマテリアルにだけオンにしてください。

VRChat深度のAuto契約​

Auto はカメラごとに深度テクスチャとPhoto Cameraの状態を直接読み取ります。アップロードフックはこの値を書き換えないため、AutoはAutoのまま出荷されます。

深度が必要なアバターには、代わりに深度ライトを載せます。マテリアルの値は変更しません。 → VRChat深度ライト

ミラーのブロックは別の話です。Force Onでも、ミラーでは深度モジュールがオフになります。 → 深度エフェクトはどこまで保証されるか

テクスチャ解像度の上限​

テクスチャ解像度の上限(アップロード時) は 軽量化 タブの テクスチャ容量を削減 セクションにあります。この設定はプロジェクトではなく Unity エディター全体で共有されます。シーンやプレハブではなくEditorの環境設定に保存されるため、同じ PC の他の Unity プロジェクトやすべてのキャラクターに同じように適用されます。

ベース・ノーマル・MatCap・マスクのように、スロット種別ごとに最大解像度を決めます。制限なし は出力サイズをそのまま保ちます。元テクスチャの最大解像度や圧縮のインポート設定は変更せず、合成・パッキングで新しく作られるメイン・ノーマル・マスクなどの出力に上限を適用します。そのまま使われる元テクスチャは、この設定では縮小されません。ビルド・アップロード中の自動処理は、上の ビルド・アップロード時に自動最適化(全体共通) がオンのときだけかかります。

テクスチャ再書き込みのオプトイン​

アップロード時もテクスチャ再書き込み(オプトイン) は既定でオフです。オンにすると、サーフェス・ノーマルの平坦化と、レビュー済みのマスク再パッキングを許可します。

オンにしたら前後を目で比較してください

読み取り、色空間、mip、プラットフォーム圧縮によってピクセルが変わることがあります。

このオプションがオフでも、数学的に損失のない重複除去は引き続き適用されます。

そこから生じる制約​

復旧可能な失敗は隔離し、致命的な失敗はビルドを止めます​

マテリアル1つの分析失敗のような復旧可能なエラーは、そのマテリアルだけを編集用に戻し、警告を残します。結果の整合性を保証できないエラーはビルドを中断します。

保存はMingToonが変更したアセットにだけ適用します。無関係なアセットを一緒に保存することはありません。

エディターがビルド途中で終了した場合​

シェーダーのスワップとテクスチャの再書き込みはディスク上のジャーナルに残ります。次のドメインリロードで自動的に復旧し、それでもだめな場合はConsoleの項目別の失敗を確認してください。

残った復旧ジャーナルは次のメニューで破棄します。

StudioRaming > MingToon > Advanced > Discard Pending Generated Shader Recovery Journal

このコマンドは復旧情報だけを破棄します

中断されたベイクが残した生成シェーダーは元に戻しません。次のベイクが作り直します。

いつ手動Bakeが必要か​

状況自動最適化手動Bake
VRChatへのアップロード十分です必要ありません
WARUDOモッドのビルド十分です必要ありません
baked マテリアルアセットを直接渡すできません必要です
シーンで結果を比較しながら承認するできません必要です

プラットフォーム別の入口​

プラットフォーム入口
VRChatアバターVRC SDKのビルドコールバック
WARUDOモッドUModのビルドプロセッサー
一般のPlayerUnityのビルド前処理コールバック

VRChat の処理は段階に分かれます。MA(Modular Avatar)前にビルド用コピーの入力所有権を分離し、MA の生成結果を受け取ってから AAO(Avatar Optimizer)前にメッシュ・テクスチャを物理的に準備します。最終変形後にアニメーション依存関係とシェーダーを解析します。

すべての前処理が MA 前に終わるわけではありません。準備結果はビルド用コピーに残り、作業用メッシュ・マテリアルを上書きしません。

関連ページ​