Skip to main content

Combiner

By the end of this page you'll know how to reduce multiple masks into one, scan an entire avatar to create packs, and how Pack + Reassign is an optional assisted feature that rewires materials — undoable in one undo.

Creates: Channel-packed texture, plus optionally rewritten materials pointing to it

Three manual features​

FeatureDoes
Channel PackingPack four masks into R/G/B/A channels of one texture
Mask MergeAdd white regions of multiple masks into one
Channel SplitUnpack a packed texture into per-channel grayscale PNGs

On manual save, save location label previews where it goes, and confirm overwrite before saving option makes it ask each time.

→ Channels and packing

Auto-optimize​

Scan the avatar's entire mask set, group 4 per pack, save pack textures. Pack + Reassign is an optional step that rewrites material slots/channels — always shown as an Execution Plan first, and undoable.

1. Scan​

Select an avatar (or hair) object.

Referenced material countBehavior
50 or fewerAuto-scan whenever selection changes
Over 50Press Scan button manually

Collects mask slots by shader profile.

ProfileSlotsChannel method
NiloToon35Channel vector — free placement
Poiyomi29Channel index — free placement
lilToon6R fixed + alpha bake

2. Exclude​

Already-optimized textures auto-exclude; list shows exclusion reason.

Exclusion reasonMeaning
Already channel packedDifferent data per channel
Not grayscaleUses color information
Multiple channel referencesOne texture in multiple channels

If needed, click Include in the exclusion list to bring it back.

3. Edit groups​

Four-per-group is auto-suggested. Check thumbnails and channel badges.

SituationHandling
Different resolutionsAuto-resize to largest
Mixed aspect ratiosShow warning
Identical duplicate filesAuto-merge into one (good for color-variant materials)

Drag row to another group card or 'New group', or use dropdown to move.

4. Execution Plan​

Before Pack + Reassign, review the Execution Plan card. It shows the pack files you'll generate and which ones would overwrite — nothing runs without reviewing the plan first.

5. Pack + Reassign​

Save pack texture and auto-change each material's texture slot · channel (R/G/B/A) · enable toggle · shader keywords. This touches materials but is completely undoable — one Ctrl+Z restores everything.

Results stay on screen with ping button; Rescan to start over.

If you want the packed texture without auto-reassignment, use manual Channel Packing instead.

Original mask files aren't deleted

Review results, then clean them up yourself. The tool doesn't delete because if you need to undo later, there's no recovery without originals.

Per-shader handling​

ShaderHandling
NiloToonScan mask slots with channel vector → RGBA pack + auto-reassign channels
Poiyomi 9.xScan mask slots with …Channel index → pack + reassign channel indices
lilToonR-fixed sampling means R slot gets priority. Alpha bake option bakes _AlphaMask into MainTex alpha, freeing slot (lilToon official method)

Shader profile (JSON)​

Use outside the built-in three (NiloToon · Poiyomi · lilToon), or to add slots the built-in missed.

ItemValue
Folder<project>/MaskMakerProfiles/*.json — outside Assets, won't delete on package update
Export Built-insSave NiloToon/Poiyomi/lilToon defaults as JSON templates. Copy and edit
ReloadRe-scan folder
Name collisionSame-named user profile overwrites built-in in place (matching priority kept). Shown as warning row

File read happens only on first scan or button press.

Schema​

{
"name": "MyToon",
"shaderNameContains": "MyToon",
"caseInsensitiveMatch": true,
"enableLilAlphaBake": false,
"slots": [
{
"texProp": "_MyMaskTex",
"channelProp": "_MyMaskChannel",
"kind": "FloatIndex"
},
{
"texProp": "_MyRimMask",
"channelProp": "_MyRimMaskChannelVector",
"kind": "Vector4Dot"
},
{
"texProp": "_MyFixedMask",
"channelProp": null,
"kind": "FixedR"
}
]
}
FieldMeaning
nameProfile name. Overwrites built-in if same
shaderNameContainsIf this string appears in material shader name, apply this profile
caseInsensitiveMatchCase-insensitive comparison
enableLilAlphaBakeIf true, materials matching this profile also join lilToon alpha bake candidates
slots[].texPropMask texture property name (e.g., _EmissionMask)
slots[].channelPropProperty that selects channel. Unused if kind is FixedR
slots[].kindOne of "Vector4Dot" / "FloatIndex" / "FixedR" (string)
Copy property names from Help

Tool header ? button → shader connection table; click a property name to select and copy. This site's Shader connections table has the same names.

Saving​

  • If a same-named file exists, you're asked Overwrite / New Name / Cancel.
  • Results stay on screen with ping button.