ビルド時の自動最適化はどう動作するのか
このページは説明です。今すぐアップロードしたい場合は VRChat を見てください。
一行でまとめると
自動最適化は既定でオンになっています。皆さんがすることはありません。
アップロード・ビルドのコピーを軽くし、作業用のマテリアルは編集できる状態に戻します。
きちんとかかったか確認する
- ConsoleのC#・シェーダーエラーを0件にします。
StudioRaming > MingToon > Validate Projectで環境条件を確認します。- ビルドログで候補数・スワップ数・顔ノーマルのベイク数を確認します。
- プロジェクトフォルダーの横の
StudioRaming/MingToonOptimizeReport.txtを開きます。 - VRChatの場合は、自分の画面・ミラー・Photo Cameraをそれぞれ確認します。
VRChatプロジェクトでは、Consoleに [MingToon] VRChat build hook compiled and registered. がセッションごとに1回出ます。
どこでオン・オフを切り替えるか
MingToonマネージャー 最適化 タブの アップロード時の自動最適化 に3つすべてがあります。一番上のトグルは はじめに タブ 4. ビルド・アップロードの自動処理 にも出ます。
| 項目 | 既定値 | 機能 |
|---|---|---|
| ビルド・アップロード時に自動最適化(全体共通) | オン | この機能全体をオン・オフします。エディター環境全体に適用されます |
| プレイモードでもビルド・シェーダー・メッシュのフックを許可(オプトイン) | オフ | Playビルドのコピーでもフックを走らせます |
| アップロード時もテクスチャ再書き込み(オプトイン) | オフ | レビュー済みのテクスチャ再加工を追加で許可します |
アバターごとに方式も選びます。 このアバターのビルド・アップロード最適化方式 が両方のタブにあります。
| 方式 | いつ |
|---|---|
| FastUpload(推奨) | 既定値です。共有シェーダーを使ってアップロード時間を短縮します |
| Legacy GPU精密最適化 | マテリアルごとに個別にベイクする従来方式が必要なときにだけ |
何が起きるのか
- 出荷対象のRendererとAnimationClipが参照するMingToonマテリアルを集めます。
- 実際に使う機能とアニメーションされる値を分析します。
- 固定機能を定数に畳んだ軽量シェーダーを作るか、キャッシュから取り出します。
- 出荷の間だけ、マテリアルのシェーダーを軽量版に差し替えます。
- プラットフォーム別の追加処理を実行します。
- 終了・失敗・ドメインリロードのいずれかが起きたら、元の状態に戻します。
生成シェーダーは編集用と同じプロパティ契約を維持します。
ビルド中だけ変わる値は定数へ畳みません。 成功したビルドは生成プロファイルとソースキャッシュを記憶し、同じアバターの次回ビルドで再利用します。 キャッシュが温まった後の体感差は、シーンとシェーダーキャッシュの環境によって変わります。
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でも、ミラーでは深度モジュールがオフになります。 → 深度エフェクトはどこまで保証されるか
テクスチャ解像度の上限
テクスチャ解像度の上限(アップロード時) はプロジェクト全体の設定です。シーンやプレハブではなくEditorの環境設定に保存され、このプロジェクトのすべてのキャラクターに適用されます。
ベース・ノーマル・MatCap・マスクのように、スロット種別ごとに最大解像度を決めます。アップロード用コピーだけを縮小し、元のファイルとインポート設定は変更しません。
テクスチャ再書き込みのオプトイン
アップロード時もテクスチャ再書き込み(オプトイン) は既定でオフです。オンにすると、サーフェス・ノーマルの平坦化と、レビュー済みのマスク再パッキングを許可します。
読み取り、色空間、mip、プラットフォーム圧縮によってピクセルが変わることがあります。
このオプションがオフでも、数学的に損失のない重複除去は引き続き適用されます。
そこから生じる制約
復旧可能な失敗は隔離し、致命的な失敗はビルドを止めます
マテリアル1つの分析失敗のような復旧可能なエラーは、そのマテリアルだけを編集用に戻し、警告を残します。結果の整合性を保証できないエラーはビルドを中断します。
保存はMingToonが変更したアセットにだけ適用します。無関係なアセットを一緒に保存することはありません。
エディターがビルド途中で終了した場合
シェーダーのスワップとテクスチャの再書き込みはディスク上のジャーナルに残ります。次のドメインリロードで自動的に復旧し、それでもだめな場合はConsoleの項目別の失敗を確認してください。
残った復旧ジャーナルは次のメニューで破棄します。
StudioRaming > MingToon > Advanced > Discard Pending Generated Shader Recovery Journal
中断されたベイクが残した生成シェーダーは元に戻しません。次のベイクが作り直します。
いつ手動Bakeが必要か
| 状況 | 自動最適化 | 手動Bake |
|---|---|---|
| VRChatへのアップロード | 十分です | 必要ありません |
| WARUDOモッドのビルド | 十分です | 必要ありません |
| baked マテリアルアセットを直接渡す | できません | 必要です |
| シーンで結果を比較しながら承認する | できません | 必要です |
プラットフォーム別の入口
| プラットフォーム | 入口 |
|---|---|
| VRChatアバター | VRC SDKのビルドコールバック |
| WARUDOモッド | UModのビルドプロセッサー |
| 一般のPlayer | Unityのビルド前処理コールバック |
VRChatのフックは遅く実行されます。Modular AvatarやVRCFuryがマテリアルを処理したあとの最終状態を分析します。
関連ページ
- 生成シェーダーのキャッシュ整理:
StudioRaming > MingToon > Advanced > Clean Build Optimization Output - 固定の配布アセット: 手動Bakeと復元
- プラットフォームのチェックリスト: VRChat · Warudo
- エラーが出たら: トラブルシューティング