VRChat
After reading this page you will be able to judge whether the current configuration can be uploaded within VRChat's limits — the parameter ceilings, the eight-slot menu page, and the SDK version.
What SDK you need
To get all the way to upload you need all of these.
| Item | Requirement |
|---|---|
| VRChat Avatars SDK | 3.x |
| NDMF | 1.x |
| Avatar materials | MingToon |
| Attachment mode | One of Modular Avatar · VRCFury · an empty VRC avatar descriptor |
If you use VRCFury it must be 1.1426.0 or newer. Modular Avatar and VRCFury are both optional, and MLC never installs either of them behind your back.
When VRCSDK Avatars cannot be found, the window shows VRCSDK Avatars was not found. The core compile plan can still be validated. You can keep validating the configuration, but you cannot upload.
256 synced bits
One VRChat avatar can use 256 synced bits, and that is a resource the whole avatar shares. The MLC menu is built inside that budget too.
The Synced Bits row of the Budget & Validation card shows the cost of both profiles together with the current budget, in the form Smooth ... / Compact ... (budget ...).
With the entire default catalog enabled, the cost is this.
| Profile | Synced bits | Parameter entries |
|---|---|---|
| Smooth | 84 | 22 |
| Compact | 41 | 51 |
Compact splits values into steps to send them and reconstructs them on the receiving side, so it saves bits at the cost of more entries. Turning features off lowers both numbers.
Leaving Profile on Auto looks at the remaining budget, tries Smooth first, and then drops to Compact.
Parameter entry count
Separately from synced bits, the entry count of the Expression Parameters itself has a ceiling too. The value MLC expects is 8192. The check right before upload compares it against the value the installed SDK reports.
Eight slots per menu page
A VRChat Expressions Menu shows at most eight slots on one page. The root row of the Menu Layout card shows the current count as Root (n / 8). Anything past that is not visible on the avatar, so group items into folders. The details are in Menu Layout.
Parameters the avatar already has
MLC's share is what other tools have left over. The Avatar Total row of the Budget & Validation card shows this in the form Foreign ... bits / ... entries + MLC (target ... bits, ... entries).
The two target values in Advanced Options work like this.
| Item | Left at 0 | Set to a non-zero value |
|---|---|---|
Target Synced Bits | Automatically uses the remaining VRC budget | That value becomes the ceiling for the whole avatar |
Target Parameter Entries | Uses the VRC maximum | That value becomes the entry ceiling for the whole avatar |
There is a separate Force Install With Unknown Budget option used only when the existing VRC parameters cannot be read. Turning it on assumes the foreign budget is empty, so use it only when you have checked yourself.
The final check before upload
Right before upload the finished Expression Parameters are inspected once more. This check reads the ceilings the installed VRChat SDK reports and compares them against the values MLC expects, so if a ceiling changed after an SDK upgrade it is caught here.
Anything caught here leaves an error in the Console starting with Ming Light Controller final VRC parameter validation failed: and the upload is stopped.
- Entry count exceeded · synced bits exceeded · SDK ceiling mismatch → error, upload stopped
- A parameter whose default value falls outside the range allowed for its type → error, upload stopped
- Empty or duplicated parameter name → warning, upload continues
The allowed default range differs per type.
| Type | Allowed default value |
|---|---|
| Bool | Exactly 0 or 1 |
| Int | An integer from 0 to 255 |
| Float | From -1 to 1 |
The upload is also stopped when the NDMF build-clone pass itself never ran. In that case it was the preparation step, not the parameter check, that stopped it, so check first that NDMF is in the project.
Preparing the MingToon materials
Building the menu is not enough; the material side has to be able to read those values at runtime. Two switches in the MingToon material inspector do that job.
| Material-side switch | Leaving it on |
|---|---|
Use VRC Runtime Controls | VRC Quality Tier and the virtual light, master adjust, and photo look properties are not folded to constants in the bake |
Switch Shadow Projection From FX | Shadow Projection is not folded to a constant in the bake |
Leaving both off folds those values to constants and gives you the lightest state, but the menu can no longer move them.
Performance Distance (m) and Performance Distance Scale are not folded in the bake regardless of these switches. Even with no MLC, storing values on the material keeps distance tiering working after upload. Note that if the product of the two is 0, the material is always drawn in the lightest state regardless of distance, and the MingToon validator raises a MING-MAT-PERF-DISTANCE-ZERO warning. If letting the in-game radial go down to 0 is your intent, leave it as it is.
Known limitations
- Direct Descriptor cannot merge into an avatar that already uses an FX controller, an Expressions menu, or Expression Parameters. Use Modular Avatar or VRCFury on such an avatar.
- Standalone attaches nothing to the avatar, so it is not a complete configuration on its own.
- The VRCFury provider is usable only when its optional assembly compiled and registered correctly.
- MLC targets MingToon materials only. It does not convert to other shaders or build controls for them.