ARLitToon is a lightweight, full-featured anime / toon-style custom shader for VRChat avatars and particle effects. Optimized for illustration-like and cel-shaded expression, it is a general-purpose toon shader specialized for character avatars, avatar accessories, and effect creation.
BOOTH -ALTIMA- https://altima.booth.pm/
This is the English edition of README.md, generated at release time by translating the Japanese README.md (the canonical source) as of version v42_GUIr0. The Japanese README remains the authoritative document. For the License (Terms of Use) section in particular, the original Japanese text is provided alongside the English translation and prevails in case of any discrepancy in interpretation.
Getting Started
Overview
Rather than physically-based realism, ARLitToon is optimized for illustration-like and cel-shaded expression. Particle color integration, dissolve, soft particles, HDR emission, and rim light are all built in as standard.
Version (Changelog)
Versions are written as integers without decimal points, as v{shader version}_GUIr{GUI revision}. The shader version (the number after v) is based on _ShaderVersion in the shader itself ARLitToon.shader, and the GUIr number is the revision of the GUI (ARLitToonGUI.cs). You can check the current version in the material Inspector header (✦ ARLit Toon ✦ v42_GUIr0). This history lists only the changes of each version. For how to use each feature and its setting values, see the sections above.
v42_GUIr0 Added Environment Adapt and Environment Tint to Back Light as well. Back Light used to decide its brightness only from "is the light behind the character" and "is it blocked by a shadow", so weakening the light did not change how bright the backlight was, and in dark worlds the backlight alone stayed strong and looked out of place. Raising Environment Adapt makes the backlight fade automatically to match the surrounding brightness (ambient light + the main light). The look in bright places does not change (it only takes effect on the darker side). Raising Environment Tint blends the hue of the surrounding light into the backlight color (brightness is left as it is). The mechanism and the feel of the controls are exactly the same as the identically named items in Rim Light, so the same tuning sense applies when you use both. If it fades too much in dark worlds, raise Dark Floor (see the Back Light section for details).
v41_GUIr0 Added Environment Adapt to Rim Light. Until now the rim glow stayed at a constant brightness regardless of the surrounding brightness, so in dark worlds the rim alone could look strongly out of place. Raising Environment Adapt makes the rim dim automatically to match the surrounding brightness, so it blends into the scenery even in dark places. The look in bright places does not change (it is a one-way adjustment that only takes effect on the darker side, so nothing that looked a certain way before becomes brighter). Raising Dark Floor keeps a faint edge visible even in pitch-dark places. In addition, raising Environment Tint makes the hue of the surrounding light blend into the rim color (bluish in cool-lit places, warmer in warm-lit places). Because it shifts only the hue and leaves brightness alone, combining it with Environment Adapt will not darken things twice. Both work the same way with Blend Mode Add / Multiply and with Unlit. Environment Adapt is ON by default (= 1), but the look in bright places is unchanged from before (because it only takes effect on the darker side). If you want a rim with constant brightness as before, set Environment Adapt to 0 (see the Rim Light section for details).
v40_GUIr2 Added Bake to Base (texture baking). This is a Unity editor tool that bakes several layer images (decals, logos, patterns, makeup and so on) and color adjustments (Hue / Saturation / Brightness) into the base texture, combining them into a single image. At runtime only one texture layer can be stacked, but with baking there is no limit on the number of images, and since the result is still a single texture, neither runtime cost nor texture memory increases. You operate it from Bake to Base, added below Texture Layer in the material Inspector. You can bake the image you set in the Texture Layer above exactly as it is, so by repeating "decide the position and blend mode in Texture Layer → bake → put the next decal in the freed slot" you can stack as many as you like (after baking, Texture Layer is turned OFF automatically so the same artwork is not applied twice, and the baked settings are taken into the recipe, so what you baked before is never lost). Color adjustments can be baked repeatedly in the same way. There is a preview that shows the baked result on the actual model before you bake, and moving any setting during preview updates the model in real time. The preview and the final output are produced by the same processing, so they look the same. The baked result is saved as a new PNG and the original texture is left untouched. The settings (recipe) are saved, so you can re-bake at any time with one click. The shader itself is unchanged, so the appearance and runtime cost of existing materials are exactly as before (see the Bake to Base section for details).
v40_GUIr1 Added a display to Receive Shadow in Lighting & Shadow that shows on the spot that it has no effect with translucent presets (GUI only). When Blend Preset is Transparent / Fade / Additive and the checkbox is ON, "(no effect in the current Preset)" is shown to the right of the checkbox, and the description below switches to a warning that explains the cause and the workaround (the Cutout preset + Dither Fade). Translucent materials cannot receive cast shadows because of how Unity works, so this display prevents the misunderstanding of "the box is checked but no shadow appears". This is a display-only change; functionality, saved values, and appearance are exactly the same as before (the checkbox still works as it did, and switching back to Opaque / Cutout makes the setting take effect again).
Open past changelog (click to expand)
- v40_GUIr0 Added Glitter / Sparkle (procedural glitter/sparkle). This is a decorative emission layer that generates fine sparkling grains without using any texture. The grains sparkle as you move your view (a metallic glitter/flake-like look). Choose from four shapes: Point (round dot) / Star (sharp-tipped cross) / Diamond / Fine Dust (very fine glitter), and switch the grain coordinate space between UV / Object (uniform on all faces via triplanar projection). The grain outlines stay sharp at any size, and they light up correctly even on the back faces of double-sided meshes. It supports scrolling (flowing grains), HDR emission (works with Bloom), and AudioLink (flickering in sync with sound). Because it's an additive layer independent of the regular Emission, it emits light on its own even with Emission turned OFF. The emission follows transparency. Default is OFF, so the appearance of existing materials is completely unchanged (see the Glitter / Sparkle section for details).
- v39_GUIr3 Changed Receive Shadow in Lighting & Shadow to the same "bold sub-heading + checkbox below it" display used by Light Limit, and increased the space above it (GUI only). A display tweak to improve visibility within the section; functionality, saved values, and appearance (when it takes effect) are exactly the same as before.
- v39_GUIr2 Moved the Dither Fade (dithered pseudo-transparency) setting from Transparency / Rendering to Texture Layer (below the alpha mask) (GUI only). Grouped it next to the alpha mask since both are "cut out by alpha" style features. Only the display location changed — the display condition (hidden with semi-transparent presets), functionality, saved values, and appearance are exactly the same as before.
- v39_GUIr1 Cleaned up and shortened the help-box text for each GUI item (GUI only). Trimmed redundant explanations down to the essentials, and moved the "see the README for details" note to appear only once at the end of each help box. Text-only change — functionality, saved values, and appearance are exactly the same as before.
- v39_GUIr0 Added Back Light. This lights up a broad area along the silhouette in an illustration-style backlight look, but only when the main Directional Light is behind the character. Unlike Rim Light (which always glows at the edges regardless of viewing angle), Back Light glows only when the light is behind the character, and areas where the light is blocked by shadows (such as the inside of a jacket) do not glow. A smaller Width broadens the lit area; a higher Directivity restricts the glow to when the light is almost directly behind. The glow follows transparency and can be disabled on backfaces. Default OFF — the appearance of existing materials is exactly the same as before (see the Back Light section).
- v38_GUIr0 Added Distance Darken (darken by camera distance). Blends the base color toward a darken color (default black) as the camera gets closer. Because it changes color rather than alpha, it also works on Opaque materials. Useful for effects like "gets darker as you approach" or "darken your hands during petting." Independent from the existing Distance Fade (alpha fade) and can be combined with it. Darkening is strongest at Darken Near and returns to the original color at Darken Far (setting Near > Far reverses it to "farther = darker"). Emission is not darkened. Default OFF — existing materials look exactly the same as before (see the Transparency / Rendering section).
- v37_GUIr4 Added ambient light shaping (always on, no settings needed). In worlds dominated by ambient light (light probes) or in backlit scenes, this automatically reconstructs a lit/shadow side from the directional information carried in the ambient light, reducing the flat, uniformly-lit look the body can otherwise get (see the Lighting & Shadow section; the change is subtle in worlds with a strong directional light). ⚠️ Since this is an always-on improvement, the appearance of existing materials can change in ambient-dominated or backlit worlds. Also added section setting copy/paste to the GUI: right-click a section's collapsible header to copy/paste that section's numeric settings as a set to another material (colors and textures are not included, so each material keeps its own color/image; Lighting & Shadow covers Shadow Intensity / Border / Blur).
- v36_GUIr0 Added Dither Fade (dithered pseudo-transparency). While still rendering as Cutout / Opaque, it produces pseudo-transparency that follows the alpha value using a halftone (dither) pattern. Because semi-transparent presets such as Fade cannot receive cast shadows (Receive Shadow) due to Unity's specification, use Cutout + Dither Fade when you want to overlay bangs over the face and see through them while still receiving shadows (see the Transparency / Rendering section). Default OFF; existing materials look exactly the same as before. As a bundled fix, also resolved an issue where, while Dither Fade was in use, the Outline color showed through the dither holes as a filled area and looked saturated (when Alpha Sync is ON, the outline now follows the same dither pattern as the body).
- v35_GUIr0 Added Receive Shadow (receive cast shadows). Shadows cast by the world’s directional light (cast shadows from trees or buildings, the shadow of your own bangs, and so on) are received as the toon shadow color (the Shadow Color / Border / Blur settings). Default ON. It appears only when the world’s light has shadow settings; in worlds without shadows the display is the same as before. If shadow banding or roughness stands out, turn it OFF or raise Shadow Blur to blend it in (see the Lighting & Shadow section).
- v34_GUIr0 Added Alpha Sync (follow material alpha) to Outline (default ON). When the body is see-through with a semi-transparent preset (
Transparent/Fade/Additive), the outline (and the outline color seen through the body) follows the body’s transparency (Color’s A × the main texture’s A) and fades together with it. Turn it OFF to return to the previous “always shown regardless of transparency” behavior. Opaque presets (Opaque/Cutout) look unchanged. Also, the A (alpha) of Base Color (HDR) now works as the opacity of the outline itself (it was ignored before; with A=1 it is the same as before. ⚠️ If a saved material had Base Color’s A below 1, the line becomes fainter from v34 — set A back to 1). Furthermore, fixed an issue where the Sweep streak saturated (blew out) the outline: the streak’s maximum brightness is now the same as the solid line with Sweep OFF, so Sweep no longer saturates the outline at any setting (previously only the streak was up to 2× brighter). ⚠️ Because of this, at Base Glow1(the old default) the tube and the streak have the same brightness, so the streak is invisible — for saved materials that use Sweep, lower Base Glow (e.g., the new default0.3; toggling Sweep OFF→ON in the GUI also auto-corrects it). - v33_GUIr0 Distance Fade now also applies to the Outline. This fixes an issue where only the body faded with distance while the outline remained visible regardless of distance. The outline now fades together with the body, using the same distance settings and the same strength. Materials that do not use Distance Fade look exactly the same as before.
- v32_GUIr1 Adjusted Outline usability (GUI only; look and saved values unchanged). (1) Moved Self-Illuminate to right after Base Color (before Intensity) (since this value governs how Intensity / Line Width take effect, the order lets you decide it first). (2) Multiplied the displayed number of the Sweep Speed by 10 (internal 0.1 = display 1). The effect and saved value do not change.
- v32_GUIr0 Added Use Outline Mask to Outline. You can partially erase the outline with a grayscale mask image (white = line / black = no line). Useful when you want to erase a line only in part, such as the corners of the eyes or the mouth, within a single material. Default OFF; with no mask assigned (white) it is exactly the same as before. Also fixed a bug where the Base Glow (Sweep-only setting) value lingered in the outline brightness when Sweep was turned OFF (when Sweep is OFF the line becomes a uniform solid line, independent of Base Glow).
- v31_GUIr5 Made each feature's checkbox retain the adjusted values when toggled OFF and then back ON (GUI only). Even if you accidentally uncheck it, values such as Strength, outline thickness, and Sweep settings no longer revert to defaults. Only when a value is 0 (= the feature is invisible) does it supply a default so it becomes visible (Matcap is visible by default so its behavior is unchanged; enabling Outline for the first time on a new material gives the shader-default look).
- v31_GUIr4 Added the ability to switch the material Inspector's display language between 日本語 / English (GUI only). Switch it with the language toggle directly below the header. The setting is remembered per editor and applies to all materials (it is not saved on the material itself = the shader, saved values, and look do not change).
- v31_GUIr3 Changed the default
Render Queueof theFade/Additivepresets from 3000 → 3001 (GUI only). Semi-transparent effects are drawn in front of glass etc. (Transparent= 3000) by default. TheTransparentpreset stays at 3000 as before (saved materials reflect it when you reselect the preset). - v31_GUIr2 Bumped the displayed numbers of the Outline Line Width slider up by one digit (GUI only). Display range
0–2→0–20. The actual effect and saved value do not change. - v31_GUIr1 Adjusted the Outline Line Width slider's display range from
0–5→0–2, to two decimal places (GUI only). The actual effect and saved value do not change. - v31_GUIr0 Adjusted Outline usability. (1) Renamed Lighting Influence to Self-Illuminate and inverted the value direction (
0= follow lighting /1= self-emit). (2) Moved Base Glow into the Sweep settings. ※ The default outline now follows lighting. For existing materials that want the old constant emission, set Self-Illuminate to 1. - v30_GUIr0 Changed the tracking method of Lighting Influence (dark-area tracking) to "track a uniform brightness from the total of the Directional Light + ambient" (improved so no light/dark boundary appears on the outline). The look and backward compatibility at
0(default) are unchanged. - v29_GUIr0 Improved Lighting Influence (dark-area tracking) to follow the main Directional Light + ambient (fixing the problem where the line sank to gray by looking only at ambient). The look and backward compatibility at
0(default) are unchanged. - v28_GUIr0 Improved Lighting Influence (dark-area tracking) to blend at the same brightness as the body (skin, hair, etc.) (fixing the problem where only the line stayed bright in dim worlds). The look and backward compatibility at
0(default) are unchanged. - v27_GUIr0 Aligned the dark-area lower bound of Lighting Influence (dark-area tracking) to the same brightness as Light Min Limit (fixing the issue where the line stayed brighter than the body in pitch-dark worlds). Backward compatibility at
0(default) is unchanged. - v26_GUIr0 Added Lighting Influence (dark-area tracking) to Outline. Default
0= self-emission as before (existing materials look unchanged). - v25_GUIr0 Fixed the problem where bright parts of the avatar blow out in worlds with many realtime lights (changed to a method that subjects additional lights to a single brightness control together). The shading of additional lights becomes simplified (per-vertex, up to 4 lights), but the impact on toon expression is negligible.
- v24_GUIr0 Fixed the problem where bright parts of the avatar blow out in worlds with strong realtime lights (so the brightness upper bound Light Max Limit also affects additional realtime lights). When Light Limit is disabled, behavior is as before.
- v23_GUIr0 Changed Outline Edge Fade to be Sweep-only (fixing the bug where the outline itself disappears on hard-edged meshes). The item moved into the Sweep settings (saved values are kept).
- v22_GUIr0 Added Edge Fade to Outline (mitigating the problem where the back-side Sweep bleeds radially through when semi-transparent). Default
2= ON,0for the old behavior. In opaque, the look does not change. - v19_GUIr0 Added Contrast to Matcap (default 1.0 = existing materials unchanged).
- v18_GUIr0 Made the 2nd Matcap an independent layer, allowing Color Tint, Strength, and Blend to be set separately for the 1st and 2nd (behavior when OFF unchanged).
- v17_GUIr0 Added a 2nd slot (Mask Select) to Matcap (default OFF = existing materials unchanged).
- v16_GUIr0 Added "Disable on Backface" to Rim Light (default OFF = existing materials unchanged).
- v15_GUIr0 Added "Disable on Backface" to Matcap (default OFF = existing materials unchanged).
- v14_GUIr0 Removed Additive from the Particle Vertex Color Blend Mode (now a choice of
None/Multiply). If a saved material hadAdditiveselected, it falls back to aMultiply-equivalent display. Also tidied the internal light lower-bound clamp processing (behavior and look unchanged). - v13_GUIr0 Usability adjustments. (1) Changed the initial value of the Particle Vertex Color Blend Mode to
None. (2) Adjusted the initial settings when enabling Outline to Sweep OFF / Intensity1/ Line Width0.1. The look of saved materials does not change in either case. - v12_GUIr0 (1) Added Blend Mode (Add / Multiply) to Rim Light. (2) Added an alpha mask mode to Texture Layer. Also changed the Outline Line Width slider display range to
0–5(the actual value and effect unchanged). - v10_GUIr0 Changed Sweep falloff from one-sided to symmetric on both sides. Changed Count to integer input (IntRange) and added Pivot Offset. Added a guide for applying to the avatar body to the README.
- v9_GUIr0 Reorganized features into a two-layer structure of Outline and Sweep (orbiting glow). Changed the default value of Base Glow to
1. - v8_GUIr0 Changed Outline edge drawing to an inverted-hull pass method. Added Line Width, Extrude Mode, and Base Glow, and removed Rim Power.
- v7_GUIr0 Changed the Outline Sweep orbit basis to the camera viewpoint (angle on screen) and removed the Axis property.
- v6_GUIr0 Added Outline Sweep (outline orbiting glow).
- v5_GUIr0 Fixed the bug where Dissolve noise became a one-directionally stretched stripe pattern on some faces of rotated objects (a latent issue since v0). The look of objects placed without rotation does not change.
- v4_GUIr0 Internal code tidy-up (refactoring). No change to features, look, or performance. No material re-setup is needed.
- v3_GUIr1 Changed so that when Unlit Mode is ON, the shadow detail properties (Shadow Color through Shadow Blur) are automatically hidden (since shadows are not computed in Unlit; GUI-only update).
- v3_GUIr0 Built the always-ON of Light Limit into the shader default value (
_UseLightLimit=1). The clamp is now active even on materials whose Inspector has not been opened. - v2_GUIr2 Made the always-ON baking of Light Limit reliable at Inspector display time (fixing the bug where the clamp did not take effect and blew out while a section was collapsed; GUI-only update).
- v2_GUIr1 Made Light Limit always ON (removed the enable/disable checkbox). Changed so the settings UI is automatically hidden in Unlit Mode (GUI-only update).
- v2_GUIr0 Added Light Limit (Directional Light influence clamp / prevents blow-out & crushed blacks).
- v1_GUIr0 Initial release.
File Structure
The shader is kept independent in its own ALTIMA/ARLitToon/ subfolder. This prevents double-imports when you additionally purchase another avatar item that uses the same ARLitToon shader, and prevents the shader from being deleted together with an item folder.
Requirements
| Unity | 2019.4 LTS or later (2022.3 LTS recommended) |
| Render pipeline | Built-in (Legacy) |
| VRChat SDK | SDK3 (Avatars / Worlds) |
| Supported platform | PC only |
On VRChat's Android (Quest) version, shaders usable on avatars are restricted to the VRChat Mobile shaders bundled with the VRChat SDK only. If this shader is applied to a Quest avatar, the VRChat client automatically replaces the custom shader with a VRChat Mobile shader. This shader is exclusively for PC-platform avatars and particle effects.
Import Steps
- Importing the distributed package (
.unitypackage) into your project unpacks it intoAssets/ALTIMA/ARLitToon/. - Unity compiles automatically. From the material's Shader dropdown, select ALTIMA > ARLitToon to apply it.
Always place ARLitToonGUI.cs inside an Editor folder. It still works outside an Editor folder thanks to the #if UNITY_EDITOR guard, but placement inside Editor is recommended.
The order of the sections below matches the display order in Unity's Inspector (material settings screen). You can configure while comparing the Inspector side by side with this guide.
Directly below the Inspector header (✦ ARLit Toon ✦) there is a language toggle (日本語 / English). It switches the display language of labels and help text. The setting is remembered per editor and applies to all materials (it is not saved on the material itself).
Transparency / Rendering
Just pick a Preset to match your purpose, and the internal blend and Cutoff settings are optimized automatically. In most cases just selecting a Preset is enough; you do not need to touch the detailed settings by hand.
# Blend Preset
(Note: for the semi-transparent presets, safety processing is automatically applied to prevent drawing errors in fully transparent regions.)
In many shaders, the Transparent-type modes can perform gradual alpha fading; however, this shader's Transparent is optimized for constantly semi-transparent texture expression such as glass, so even if you lower the material's transparency (_Color.a or the texture's alpha), highlights (specular reflection), environment reflection, and emission remain without becoming transparent (to preserve the texture). Even if you animate _Color.a to 0, only the reflections, mirrored scenery, and emission remain.
Therefore, when you want to fade in/out the whole object via the material alpha or _Color alpha, select Fade (opaque emission and reflections become transparent too) or Additive.
[Exception: particle lifetime fade] Even in Transparent, if you lower it via the particle vertex color alpha (Color over Lifetime), then highlights, environment reflection, and emission (including Dissolve edge, Rim, and Emission) all disappear completely. This is because it distinguishes "material transparency = how see-through the glass is (reflections remain)" from "particle lifetime = existence itself (when it disappears, everything disappears)". The effect of erasing a Transparent glass material with Dissolve works by this mechanism too, naturally vanishing along with the reflections. Use it with Vertex Color Blend Mode set to Multiply.
# Detailed settings (normally no change needed)
| Property | Description |
|---|---|
| ZWrite (depth write) | Whether to write the object's front/back (depth) information. The Preset sets the optimal value automatically, so normally no change is needed. On is for opaque and draws front/back relationships correctly; Off is for semi-transparent and enables correct overlap-order drawing. |
| Cull | Specifies which faces to draw. Back (standard) draws front faces only, Off draws both faces, Front draws back faces only. For thin shapes such as cloth, leaves, and ribbons where you also want to show the back, use Off. |
| Alpha Cutoff | The threshold below which texture alpha is cut out (erased). Mainly used in Cutout mode. For semi-transparent presets, it is automatically set to 0.001 to prevent errors in transparent regions. |
| Render Queue | The order in which objects are drawn. The larger the value, the later (more in front) it is drawn. The Preset sets this automatically. |
Fade / Additive default to Render Queue = 3001 (in front of glass etc. at Transparent = 3000). This is to avoid the phenomenon where, when the Render Queue is the same (both 3000), Unity reorders front/back by per-object distance and a semi-transparent effect appears to slip behind the glass.
If a particle or effect is still hidden behind distant glass, you can draw it in front by raising the Inspector's Render Queue value further, to 3050 for example. If it comes too far forward, lower the value.
# Soft Particles
A feature that erases the unnatural boundary line where a semi-transparent object (Fade/Additive, etc.) intersects with an opaque object such as the ground or a wall, blending it smoothly.
| Property | Description |
|---|---|
| Fade Distance | Adjusts the distance over which the boundary line fades out (becomes transparent). |
Specification note: Works only when ZWrite is Off (i.e., a semi-transparent preset). Also, on VRChat thumbnail cameras and the like (orthographic cameras) it is automatically disabled to prevent glitches.
Soft particles work only when the VRChat world's camera is generating a "depth texture". Specifically, it becomes active when the world uses Deferred Rendering, uses post-processing, or uses another soft-particle shader.
In a simple Forward Rendering world that does not meet the above conditions, the soft-particle feature is automatically disabled and displayed as ordinary semi-transparent rendering. This is a specification-level constraint that depends on the VRChat world's rendering settings and cannot be controlled from the avatar-side shader. Other VRChat shaders have the same constraint.
[Behavior in unsupported worlds] It is drawn semi-transparently with the boundary line remaining, but the effect itself displays normally. No breakdown such as full transparency occurs.
# Distance Fade
A feature that fades the object's alpha according to distance from the camera. You can use it to prevent your own aura or effects from blocking your view in first-person, or for staging where things disappear as you approach. The Outline also fades together with the body, using the same distance settings.
| Property | Description |
|---|---|
| Use Distance Fade | Enable/disable the feature. |
| Fade Near | At or below this distance (from the camera), it becomes fully transparent. |
| Fade Far | At or above this distance, it becomes fully opaque (normal display). |
Specification note: Since this manipulates alpha, it assumes use with a semi-transparent preset (Fade / Additive / Transparent). It can also be used on Cutout / Opaque if Dither Fade is turned ON (alpha is reflected as the halftone density). Setting Fade Near to a value larger than Fade Far reverses the behavior, making it "more transparent the farther away". _DistanceFadeNear / _DistanceFadeFar can also be animated.
Base
| Property | Description |
|---|---|
| Albedo Texture | The base image applied to the model's surface. By giving it an A (alpha) channel, you can also express cutouts and semi-transparency. |
| Color | Adjusts the overall hue. Use it to overwrite the texture's color with a different color, or to darken slightly to match a dark world. (You can also change the color via animation.) |
| Color Intensity | Adjusts the brightness (intensity) of the color from 0. Raise the value when you want the whole to appear brighter at once. |
| Hue Shift | Lets you rotate the hue to create color variations without editing the texture. 0 = no change. Animating it can cycle through rainbow colors. |
| Saturation / Brightness | Corrects saturation and brightness. Both are no-change at 1 (2 = doubled). For muting or vivifying colors. |
| Albedo/Normal Scroll | Entering scroll speed in X / Y makes Albedo and Normal flow at the same speed (0 = stopped). Used for flowing flames, water, scan-line effects, etc. |
At their default values (Hue=0 / Sat=1 / Bright=1), Hue/Saturation/Brightness perform no processing at all (identity transform), so they do not affect the look or performance of existing materials.
Texture Layer
A feature with two parts: a "color overlay" that lays another image over the base texture, and an "alpha mask" that cuts out the base by the image's brightness. The two are independent toggles — you can use either one alone or both together (they share the same Layer texture).
# ① Color Overlay (Use Texture Layer)
Useful for logos, embroidery, accent patterns, tattoos, makeup, two-layer effect patterns, and more.
| Property | Description |
|---|---|
| Use Texture Layer | Enable/disable the color overlay. |
| Layer Texture (A = blend mask) | Sets the image to overlay. The image's alpha (transparency) channel becomes the blend-strength mask (white = blend / black = skip). You do not need a separate mask image. With Tiling/Offset you can position and repeat it independently of the base. |
| Color Tint (HDR) | The tint applied to the layer image. Being HDR-capable, combined with Add/Screen it can also produce glowing overlays. |
| Blend Mode | The compositing method. Normal (ordinary overlay) / Multiply (shadows or grime) / Add (glowing overlay) / Screen (brightening overlay). |
| Opacity | The strength of compositing (0 = fully transparent to 1 = maximum). Animatable, so you can fade patterns in/out. |
| Scroll | Entering speed in X / Y makes the layer image flow (0 = stopped). |
# ② Alpha Mask (Use Texture Layer as Alpha Mask)
A feature that cuts out the base shape with a grayscale mask image.
| Property | Description |
|---|---|
| Use Texture Layer as Alpha Mask | Enable/disable the alpha mask. |
| Layer / Mask Texture | Sets the mask image (shared with the color overlay). The image's brightness becomes transparency (black = transparent / white = opaque / gradient = semi-transparent). If you use only the mask with the color overlay OFF, opening this toggle reveals the texture field. |
| Scroll | Flow the mask to move the cut-out position (0 = stopped). |
How to use the mask: Prepare a grayscale (black-to-white) mask image, painting the parts you want to make transparent in black and the parts you want to keep in white. Midtones and gradients become semi-transparent. When used together with the color overlay, the same image splits roles as brightness = alpha mask / alpha = color blend mask.
The alpha mask is visible with the semi-transparent Blend Presets (Cutout / Fade / Transparent). With Opaque, opacity is ignored, so it does not become transparent. For a crisp cutout, Cutout is suitable; for a smooth gradient fade, Fade is suitable. With Transparent, by design the material's transparency is preserved, so highlights such as reflections and emission remain without being erased by the mask (for glass expression).
The color-overlay compositing affects only the object's color (appearance) and does not change opacity. Hue Shift affects only the base color and does not affect this layer image (to preserve the color of logos, etc.). When disabled, the load is essentially zero.
# Dither Fade (dithered pseudo-transparency)
While still rendering as Cutout / Opaque, this thins out pixels with a fine halftone (dither) pattern to create pseudo-transparency that follows the alpha value. It is placed in this section because it is a "cut out by alpha" style feature, like the alpha mask above.
| Property | Description |
|---|---|
| Dither Fade | Enable/disable the feature (default OFF). When ON, the alpha value of the texture or layer mask directly becomes the "proportion of pixels kept". |
Semi-transparent presets such as Fade cannot receive cast shadows (Receive Shadow) due to Unity's specification. For parts you want semi-transparent but still receiving shadows, such as bangs, using the Cutout preset + Dither Fade ON lets you see through them following the alpha while still receiving shadows.
Because the halftone thins per pixel, a dotted pattern may be visible at very close range (it is less noticeable in environments where anti-aliasing (MSAA) is enabled). Between the Scene view, the Game view, and VRChat itself, the resolution, anti-aliasing, and camera angle differ, so how the halftone looks (the degree of transparency) changes. Please check the final look in VRChat itself. Alpha Cutoff can be used together; alpha below the Cutoff is fully clipped as before. Alpha from Distance Fade and from the texture layer's transparency mask is also reflected as the halftone. This feature is disabled on semi-transparent presets (Fade / Transparent / Additive) (normal alpha blending is used).
When the Outline's Alpha Sync is ON (default), the outline follows the same halftone as the body (preventing the outline color from showing through the dither holes as a filled area and looking saturated). Turning Alpha Sync OFF makes the outline not follow the halftone and be shown constantly.
Bake to Base (texture baking)
A Unity editor tool that bakes several layer images (decals, logos, patterns, makeup and so on) and color adjustments into the base texture, combining them into a single image. Whereas the Texture Layer above stacks only one image at runtime, this one bakes everything into a single image in advance, so there is no limit on how many images you stack, and neither runtime cost nor texture memory increases (after baking it is still a single texture).
This feature is provided by the additional file Editor/ARLitToonBaker.cs. It is always included in the distribution package. If this file is missing, the only difference is that Bake to Base does not appear in the material Inspector; every other feature of the shader works normally.
| Item | Description |
|---|---|
| Create Bake Recipe | Creates a settings file (recipe) for this material. It is saved in the same folder as the material as <material name>_BakeRecipe.asset, and records the layer configuration. |
| Source Texture (Base) | The image that serves as the foundation for baking. The Albedo texture at the time the recipe was created is filled in automatically. This item does not change even after baking (you can re-bake from here any number of times). Baked textures are saved in the same folder as this image (shown in Output folder just below). |
| Output Resolution | The default is "same as source". If you change it, the image is scaled while preserving the source's aspect ratio. |
| Base Color Adjust (shown in Preview) | Hue / Saturation / Brightness applied only to the source texture. This adjustment is not reflected on the material directly; you first see it in the preview or in the bake. It does not act on the layers. It is held as a single value, so the adjustment never accumulates no matter how many times you re-bake. |
| Also take the material's Color Adjust (HSV) | Includes the material's Hue / Saturation / Brightness in the bake; after baking they are consolidated into Base Color Adjust and the material side is reset to its initial values (0 / 1 / 1) (default ON). This is a checkbox only — edit the values in the Base section above (during preview, the values being taken in are displayed numerically). Color and Color Intensity are not baked (they are left so you can animate them for color-change gimmicks and the like). |
| Also bake Texture Layer | Bakes the layer set in the Texture Layer above, stacked at the bottom (furthest back) (default ON). The texture, Color Tint, Blend Mode, Opacity, Tiling / Offset and alpha mask settings are all reflected as they are. After baking, Texture Layer is turned OFF automatically and its settings are taken into the top of the layer list below (you can reorder with ▲▼ after it is taken in). This prevents the same artwork from being applied twice and keeps re-bakes producing the same result. Since the slot is freed, you can use it for the next decal. |
| Layers | The images to bake are stacked in order from the top (the higher in the list, the further back; the lower, the further front). Use ▲▼ to reorder, ✕ to delete, and the checkbox on the left to disable temporarily; values can be edited later as well. Baking always rebuilds from the source texture following this list, so you can fix things later and re-bake. A baked Texture Layer is shown as (captured from Texture Layer). |
| Layer Adjust (this layer only) | Hue / Saturation / Brightness applied only to that layer's image. It does not act on the base color or on any other layer at all. Use this when you want to change only the color of a decal. |
| Add Layer | Separately from Texture Layer, you can add any number of images here and bake them all at once (these layers do not exist at runtime). For each one you can specify Texture / Color Tint (HDR) / Blend Mode / Opacity / Tiling / Offset plus the adjustment above. Blend Mode and Opacity mean the same as in Texture Layer. |
| Cut out the base by luminance | Uses the brightness of that layer image as an alpha mask and cuts out the base's opacity (black = transparent / white = opaque). This is the same calculation as Texture Layer's "alpha mask". |
# Typical workflow
- Set the image you want to overlay in the Texture Layer above, and decide its position (Tiling / Offset) and blend method (Blend Mode) while looking at the actual result.
- Open
Bake to Baseand pressCreate Bake Recipe. If you want to stack several more images at once, register them withAdd Layer. - Press
Preview (temporary bake)to check the baked result on the actual model. During preview, moving any bake setting (base color adjustment, each layer's adjustment, Opacity / Tiling / Offset and so on) is reflected on the model in real time. The same applies when you change the Texture Layer settings above. It also followsCtrl+Z(undo). To return to the original state, pressEnd Preview. - If everything looks right, press
Bake (create a new texture). The result is saved as a new PNG (<material name>_Baked.png) and the Albedo texture is replaced with it. A new file is created on every bake (_Baked 1.png→_Baked 2.png…), so previously baked textures are never overwritten. The save location is "the same folder as the source texture" (shown inOutput folderinBake to Basebefore you bake). When it finishes, a window showing the texture name and the save path opens (you can select and copy the text, andShow in Projecttakes you to the asset). The baked Texture Layer is turned OFF automatically, and the color adjustments taken in are consolidated intoBase Color Adjustwhile the material side returns to its initial values (so they are not applied twice). - To stack more, set the next image in the freed Texture Layer and repeat 3–4.
- To start over,
Revert to Source Texturereturns you to the never-baked state (source texture, HSV, and the Texture Layer ON/OFF). At the same time, the steps that baking added automatically (color adjustments and the taken-in Texture Layer) are undone together (layers you added yourself remain).
Each bake rebuilds from "source texture + bake steps", but what you baked remains as steps, so from the second time on, previously baked content is not lost. Because it is rebuilt from the original every time, image quality does not degrade no matter how many times you bake.
The base color adjustment applies only to the source texture, and a layer's adjustment applies only to that layer; they do not affect each other. Use a layer's adjustment when you want to change only a decal's color, and the base color adjustment when you want to change only the underlying image. Neither accumulates (they are never applied twice no matter how many times you re-bake).
Note that the adjustment taken in by Also take the material's Color Adjust (HSV) applies only to the base color. If you move the material-side sliders while layers already exist, the whole color appears to change on screen while only the base changes in the baked result, so a caution is shown in the Inspector in that case (use each layer's adjustment when you want to change the layer colors too).
Look at Last result shown at the bottom of Bake to Base (for example: Baked: base adjust yes / layers 2 (1 adjusted) (incl. Texture Layer)). If it says layers 0, no image was baked that time (typically because Texture Layer is OFF or no texture is set).
The bake result is saved as a new file every time (delete old baked results you no longer need from the Project window). Also, when you bake the color adjustment (HSV), Hue / Saturation / Brightness are automatically reset to their initial values (0 / 1 / 1) so the same adjustment is not applied twice. These operations can be undone with Unity's Undo (Ctrl+Z).
However, the preview is uncompressed while compression settings apply after saving, so there can be a very slight difference in color. Do your final check after saving.
Adjust colors during preview with Base Color Adjust and each layer's Layer Adjust. When the preview starts, the material's Hue / Saturation / Brightness return to their initial values once (because they are included in the bake). Use these two sliders when you want to fine-tune the color (they are reflected in real time and are baked with exactly those values).
Baking is an operation in UV space. Elements that move over time cannot be baked (such as Texture Layer's Scroll). When Scroll is non-zero a caution is shown and the stopped (starting position) image is baked. Set Scroll to 0 and match the position with Tiling / Offset. Also, after baking you cannot animate layers individually (scrolling, fading, color changes). If there is one image you want to animate, use Texture Layer (runtime compositing); bake the designs that do not move.
Note that if you bake the color adjustment (HSV) while Color is tinted, the color can change slightly before and after baking (at runtime, Color is multiplied first and then HSV; in baking, HSV is applied to the image first and then Color). A caution is shown in the Inspector when this condition applies. Check with the preview, or set Color to white before baking.
Lighting & Shadow
| Property | Description |
|---|---|
| Unlit Mode | Completely ignores light sources and always displays at 100% brightness. For particles and emission effects. |
| Shadow Color / Intensity | Adjusts the shadow color and the depth (darkness) of shadows. |
| Shadow Border | Adjusts the position of the boundary line between light and shadow. Important when creating an anime-style (toon) look. |
| Shadow Blur | Adjusts the softness (smoothness) of the shadow edge. If shadows on spheres etc. look jagged, or to blend cast shadows nicely, raise the value a little. |
| Receive Shadow (receive cast shadows) | Receives shadows cast by the world's directional light (cast shadows from trees or buildings, the shadow of your own bangs, etc.) as the toon shadow above (Shadow Color / Border / Blur) (default ON). In worlds where shadow banding or roughness stands out, turn it OFF or raise Shadow Blur to blend it in. |
Shadows are received only when the world has a real-time directional light, that light's shadows are enabled, and you are within the shadow drawing distance. In worlds that do not meet these conditions the display is the same as before (the same look as OFF). The avatar's ability to cast shadows has always been active; this setting only concerns the receiving side.
Semi-transparent presets such as Fade / Transparent / Additive cannot receive directional-light shadows due to a constraint of the Unity Built-in pipeline (turning it ON does not add shadows). For parts you want to be semi-transparent but still receive shadows, such as bangs, use the Cutout preset + Dither Fade (dithered pseudo-transparency) (see the Texture Layer section).
GUI display (v40_GUIr1 and later): When the checkbox is ON with a translucent preset, "(no effect in the current Preset)" is shown to the right of the checkbox, and the description below switches to a warning that explains the workaround (display only; the saved value does not change). The checkbox still works as it did, so switching back to Opaque / Cutout makes what you set take effect as-is.
# Light Limit (ambient clamp / prevents blow-out & crushed blacks)
When a world's ambient light is excessively bright or dark, this limits the amount of light the avatar receives to a fixed range, preventing blow-out and situations where everything is pitch black and invisible. It makes dark worlds darker, and in bright worlds leaves headroom for brightness within a range that does not blow out.
| Property | Description |
|---|---|
| Light Min Limit | The lower bound of brightness in dark places. The lower it is, the darker it gets in dark worlds (0 = no lower bound = can go fully dark). |
| Light Max Limit | The upper bound of brightness in bright places (prevents blow-out). The higher it is, the brighter it appears in bright worlds. |
This feature is always enabled. It acts only when Lit (Unlit OFF); in Unlit Mode it does not respond to light, so this section itself is automatically hidden. Emission and environment-reflection mirroring are not subject to the limit. Additional realtime lights are also subjected, together with the main light and ambient light, to a single upper/lower-bound pass (additional lights are treated per-vertex, up to 4 lights). _LightMinLimit / _LightMaxLimit can be animated.
PBR & Specular
| Property | Description |
|---|---|
| Metallic / Smoothness | Adjusts metallic-ness and surface smoothness. Raise the values when you want a glossy metallic look that reflects the surrounding scenery. |
| Normal Map + Scale | Use this when you want to express fine bumps (clothing wrinkles, brick grooves, etc.) without increasing polygon count. |
# Specular Reflection (environment reflection / glass & metal mirroring)
A feature that mirrors the world's scenery (reflection probes / skybox) onto the surface. Used for glass, metal, wet surfaces, etc.
| Property | Description |
|---|---|
| Reflection Strength | The strength of the mirroring. 0 = disabled (default; zero load as before). |
| Fresnel Power | The sharpness of edge reflection. The larger it is, the more only the grazing "edge" reflects strongly, becoming glass-like. Lower it and the whole face reflects uniformly (for mirrors/metal). |
| Fresnel Min | The reflection amount of front-facing surfaces. Near 0 for glass; raise it for mirrors/metal. |
| Specular Highlight | Adds a light-source highlight (shine) independently of Metallic. For the sparkle of glass/plastic. |
Reflection sharpness is determined by Smoothness (high = crisp like a mirror / low = blurry like frosted glass).
Set Blend Preset to Transparent, Unlit OFF (Lit), raise Reflection Strength, and set Fresnel Power to about 4–6. As needed, add shine with Specular Highlight and a pseudo-gloss with Matcap. Because Transparent does not let the material transparency (_Color.a) make reflections, highlights, or Matcap transparent, the mirroring rides on solidly while the object is faintly see-through. (With Fade/Additive, reflections also follow the alpha and become transparent.)
Note that if you use Transparent glass on particles and fade it out via Color over Lifetime, everything including environment reflection, Matcap, and emission disappears completely. Even in an effect that erases the glass with Dissolve, it naturally vanishes along with the reflections.
※ Because Unlit Mode does not respond to light, environment reflection, specular highlights, and Matcap are all not displayed. Always use glass in Lit (Unlit OFF).
What is mirrored depends on the VRChat world's reflection probes / skybox. In worlds without probes placed, reflections may appear dark (a specification-level constraint that depends on the world environment, the same as soft particles and AudioLink).
Matcap
Expresses a constant, beautiful gloss or environment mirroring "pseudo-style". It is very light to process, making it valuable in VRChat.
| Property | Description |
|---|---|
| Matcap Texture | Set a sphere-drawn, environment-reflection-style image (such as a hair angel-ring or silk shine). |
| Strength / Blend | Adjusts the compositing strength and mode (0 = multiply-down / 1 = additive glow). |
| Contrast | Strengthens the matcap's light/dark definition. Raising the value tightens the highlights without lifting the dark areas, giving a metallic texture (default 1.0 = no change). For a metal look, the guideline is Blend=Add plus a higher Contrast. |
| Highlight Threshold / Boost | Applies the gain of Boost only to areas brighter than the Threshold (brightness threshold), sharpening only the specular shine. It does not lift dark areas or the base. Used together with Contrast it becomes even more metallic (default Boost=0 = no change). |
| Disable on Backface | With double-sided rendering (Cull = Off), does not apply Matcap to backface meshes. Use it when you want to keep sleeve linings, coat interiors, etc. dark and subdued. Default is OFF. |
| 2nd Matcap (Mask Select) | In a single material, switches between 2 kinds of Matcap per part. It switches by the region mask (grayscale): black = 1st / white = 2nd. The 1st and 2nd can each set Color Tint, Strength, and Blend independently (e.g., bright metal for trim, subdued silk for cloth). Default is OFF. |
Turning on "Use 2nd Matcap" reveals Matcap Texture 2, Matcap 2's Color Tint / Strength / Blend / Contrast / Highlight, and the region mask. The grayscale of the mask switches the Matcap (black = 1st / white = 2nd / midtones interpolate), and the mask is sampled with the same UV as the main texture. Because the 1st and 2nd can each set color, strength, blend mode, contrast, and highlight emphasis independently, you can craft different textures per part. Backface disable and lifetime fade apply to both Matcaps. When OFF, or when the 2nd is not assigned, it works as a single Matcap as before, with no change in load.
This option takes effect when the drawing setting Cull is Off (double-sided). Turning off Matcap on backfaces means no highlight rides on those faces, so they naturally appear darker (recessed linings). When Cull is Back (backfaces not drawn; default), backfaces are not displayed, so turning this on does not change the look. Cull is in the "Transparency / Rendering" detailed settings.
Note: Matcap, as a highlight type, also fades following the particle color's alpha (Fade/Additive, and during Transparent particle lifetime fade). In Transparent, it remains without becoming transparent via the material transparency (_Color.a), and disappears naturally along with the mirroring via the particle Color over Lifetime.
Because Unlit Mode is for self-emission only and does not respond to light, Matcap, environment reflection, and specular highlights are all not displayed. Use glass expression that relies on Matcap or mirroring in Lit (Unlit OFF).
Emission (HDR-capable)
Makes a material that self-illuminates even in darkness.
| Property | Description |
|---|---|
| Emission Color HDR / Intensity | Adjusts the emission color and strength. Raising Intensity makes Unity's Bloom (the light-overflow effect) work nicely. |
| Emission Map | Specify where to emit with a black-and-white image, etc. |
| Scroll | Entering speed in X / Y makes the Emission Map flow (0 = stopped). For expressing energy flow, etc. |
| Pulse Speed / Pulse Min | Makes the emission pulse (blink). Pulse Speed is the blink speed (0 = disabled), and Pulse Min is the brightness at the darkest point (0 = blinks all the way to fully off). |
Note: Emission also fades in/out following the particle color's alpha (Fade/Additive, and during Transparent particle lifetime fade). It disappears naturally along with the emission via Color over Lifetime.
AudioLink (music-reactive emission)
A feature that emits in sync with the music playing in the world. A staple feature in VRChat club worlds and live performances.
This shader's AudioLink works as a "sound-reactive emission layer" independent of the regular Emission (constant emission). Because it adds emission toward the base (color × Intensity) according to the loudness, even with regular Emission OFF, you can make it emit in sync with sound using AudioLink alone. Conversely, if you turn regular Emission ON, the sound-reactive emission layers on top of the constant emission (the two do not cancel each other).
| Property | Description |
|---|---|
| Use AudioLink | Enable/disable the feature. Turning it ON automatically sets the reaction amount and Intensity to 1 so it reacts immediately (existing values are kept). |
| AudioLink Band | Choose the frequency band to react to, from Bass / LowMid / HighMid / Treble. Bass reacts to kicks, treble to hi-hats, etc. |
| Emission Reaction (Master) | The amount of tracking to sound. 0 = no reaction, 1 = fully linked to volume (AudioLink emission vanishes during silence). _AudioLinkEmission can be animated. |
| AudioLink Emission Color (HDR) | The color to glow with on sound reaction (HDR). Can be specified separately from regular Emission. |
| AudioLink Emission Intensity | The strength of sound-reactive emission. The upper bound of brightness reached at sound peaks (0–16). |
The "where it glows" location shares the Emission Map. If you have regular Emission OFF, specify where to glow using the Emission Map shown in the AudioLink section (white = glows / black = does not glow; if unset, the whole surface reacts). If you have regular Emission ON, the Emission Map set in the Emission section is used as-is.
AudioLink emission is an additive layer computed as Emission Map × AudioLink Emission Color × Intensity × (volume × reaction amount). If reaction amount or Intensity is 0 it does not glow, so set both greater than 0 (1 each is standard). Because it is a separate system from the regular Emission Color / Intensity, setting the regular Emission Intensity to 0 does not affect the AudioLink emission.
Usage note: If you also want regular Emission (constant emission), turn on the Emission section. If you use only AudioLink emission, you can leave Emission OFF.
AudioLink works only when the AudioLink system is installed on the VRChat world side (the world must provide the global audio data texture). In worlds without AudioLink support, this feature is automatically disabled (no breakdown occurs). Like soft particles, this is a specification-level constraint that depends on the world environment.
Glitter / Sparkle (procedural glitter)
A decorative emission layer that scatters fine sparkling grains (glitter/sparkle) across the surface, without using any texture. The grains are generated procedurally inside the shader, so no dedicated noise image is needed. The grains sparkle as you move your view (a shimmering look like metallic glitter or flakes, glinting at different viewing angles). Because it works as an additive layer independent of regular Emission (constant glow), you can get glow from Glitter alone even with Emission turned OFF.
| Property | Description |
|---|---|
| Use Glitter | Enable/disable the feature. Turning it ON automatically sets Intensity to 1 (existing non-zero values are preserved). |
| Glitter Color (HDR) | The glitter's emission color (HDR). Raising Intensity affects Bloom. |
| Intensity | Glow strength (0–16). |
| Shape | Choose the grain shape from Point (round dot) / Star (a sharp-tipped, cross-shaped sparkle) / Diamond / Fine Dust (high-density, very fine glitter). The outline stays sharp at any size (no blurring even when enlarged). |
| Space | Choose the grain's reference coordinate space: UV (follows the mesh's UVs — natural scrolling, good for flat surfaces/particles) / Object (object space, via triplanar projection — uniform without stretching even on cube faces or sphere poles) / View (a "billboard"-style look where grains always face the camera, based on world-space coordinates — completely unaffected by the mesh's UV layout or face orientation). |
| Grain Scale | The size of a single grain. Larger values make grains bigger, smaller values make them finer (default 181). Making grains smaller automatically increases their count, so density doesn't run out even with fine glitter. Raise the value for chunkier glitter (around 290 gives coarse glitter). |
| Coverage | The proportion of grains that actually glow. Closer to 0 is sparser, closer to 1 is denser (default 0.6). |
| Size | The fill ratio of a single grain (how large it's drawn within its cell — default 0.7). Independent from density, so increasing density while keeping grains large doesn't cause clipping (adjust the grains' absolute size via Grain Scale). |
| View Sharpness | Sharpness of the view-dependent glint. Higher values produce a sharper, more momentary flash at specific angles. |
| Flicker Speed | Flicker speed (0 = no flicker). Flicker is randomized per grain — each grain has its own speed and timing. It further layers two waves of differing period, so a repeating flicker pattern at the same spot is effectively imperceptible. |
| Scroll (X,Y) | Speed at which grains flow (translates the UV/Object coordinates). Only X/Y fields are exposed (Z/W are unused). |
| AudioLink | When ON, drives the glitter's flicker in sync with audio (AudioLink). Adjust with Band (which audio range to react to) and Sound Strength (how strongly the audio affects it). |
| Mask with Emission Map | When ON, restricts where glitter appears using the Emission Map's brightness (white = appears / black = doesn't). The map is shared with Emission (whole surface if unset). |
How it works: Glitter is an additive glow layer computed as Glitter Color × Intensity × (shape × view glint × flicker × (AudioLink) × mask). Because it's procedurally generated without a texture, it adds no samplers or keywords (upload-time compile cost is unaffected). The glow follows transparency and blends naturally with particle lifetime fades and semi-transparency. Glitter Color / Intensity / Flicker Speed, etc., can also be animated.
Note: As with other audio-reactive features, AudioLink only works when the VRChat world has the AudioLink system installed (in unsupported worlds only the audio-driven flicker is automatically disabled — the glitter itself still displays normally). Because the Object coordinate space is object-space based, the grains stay fixed to the surface as the avatar moves/rotates (UV, being dependent on the mesh's UV layout, will stretch the grains wherever the UVs are stretched). On double-sided (Cull Off) meshes, grains on the back faces also glow correctly.
About the View coordinate space: Because the grains stay tied to world-space coordinates while always facing the camera, they completely disregard the mesh's UV layout, face direction, or front/back sidedness. Like Object, it's composited via triplanar projection, so grains don't stretch even on obliquely viewed surfaces. Grain shape and size stay uniform even on meshes without UVs, on heavily UV-distorted areas, or on double-sided polygons. It's also unaffected by object scale, so grain size stays consistent across multiple meshes. It also matches between your left and right eyes in VR. Note that rotating the camera reshuffles the arrangement of grains (this is inherent to always facing the viewer).
Dissolve (disappear effect)
A feature that makes objects disappear/appear as if melting along a noise pattern.
| Property | Description |
|---|---|
| Dissolve Texture | Set the noise image that serves as the basis for how it melts. |
| Threshold | The progress of disappearance (-1.0 = fully visible to 1.1 = fully erased). Animating this creates a beautiful disappear effect. |
| Noise Scale | The fineness of the noise pattern (1 = standard / 10 = fine). Because it uses object-space Triplanar mapping, a uniform pattern is maintained regardless of scale changes or face orientation. |
| Edge Width / Edge Color | Specifies the glow width and HDR color of the melting edge. |
Note: The glow of the melting edge fades in/out following the particle color's alpha (opacity) (Fade/Additive, and during Transparent particle lifetime fade). Even in the staging where a Transparent glass material is erased with Dissolve, it disappears naturally along with the edge glow.
Rim Light (edge light / backlight expression)
A feature that emphasizes the model's outline (edges). With Blend Mode you can switch between "making it glow" and "darkening it down".
| Property | Description |
|---|---|
| Rim Color HDR / Intensity | The color and strength of the edge. With Add, lift the character off the background or express a magic aura; with Multiply, express a dark edge outline. |
| Rim Power | Adjusts the thickness of the effect. The larger it is, the thicker and softer; the smaller, the thinner and sharper the edge. |
| Blend Mode | Add (default) makes the edge glow additively (backlight / aura). Multiply darkens the edge. Setting Rim Color to a dark tone makes a dark-edged outline (black rim). |
| Disable on Backface | With double-sided rendering (Cull = Off), does not produce rim on backface meshes (acts in both Add/Multiply modes). Use it when you want to keep sleeve linings, coat interiors, etc. dark and subdued. Default is OFF. |
| Environment Adapt | Dims the rim to match the surrounding brightness (ambient light + the main light). This keeps the rim from looking out of place in dark worlds. The value is the degree of "how much it is affected by the environment": 1 (default) follows it fully, 0 gives a rim of constant brightness as before. In places at least as bright as being well lit by white light, the look is the same as before, and it dims the darker it gets from there (i.e. it only takes effect on the darker side). It acts in both Add / Multiply modes and in Unlit as well. |
| Dark Floor | The lower limit of how much rim remains in pitch-dark places. 0 (default) turns it off completely; around 0.2 keeps a faint edge visible even in darkness. Use this value to adjust when you feel it dims too much in dark worlds. It is shown only when Environment Adapt is greater than 0. |
| Environment Tint | Blends the hue of the surrounding ambient light into the rim color. In cool-lit worlds the rim shifts bluish, and in warm-lit worlds such as a sunset it shifts warm. 0 (default) leaves the color unchanged. Because it shifts only the hue without changing brightness, it does not darken twice when combined with Environment Adapt. It is independent of Environment Adapt, so you can also use it as "keep brightness constant and only blend the color" (Environment Adapt 0 + Environment Tint 1). The effect appears as suppressing the components contained in the rim color by the amount of the ambient light's hue, so the whiter or paler the rim, the more clearly it changes. |
To make a black rim (darkening the edge): Set Blend Mode to Multiply and set Rim Color to black or a dark tone. Adjust the darkening strength with Intensity and the outline thickness with Rim Power.
About "Disable on Backface": This option takes effect when the drawing setting Cull is Off (double-sided). When Cull is Back (backfaces not drawn; default), backfaces are not displayed, so turning it on does not change the look. Cull is in the "Transparency / Rendering" detailed settings (the same idea as the option of the same name in Matcap).
Where Environment Adapt is useful: The rim glow is by nature a "constant regardless of how light falls" effect, so in dark worlds the rim alone can stay bright and look out of place. Environment Adapt (default 1) follows the surrounding brightness and darkens it automatically, so it blends into many worlds as-is. The look in bright worlds does not change, so the only place that needs adjusting is dark ones. If it disappears too much in the dark, raising Dark Floor (or lowering Environment Adapt slightly) is the guideline. Conversely, if you want the rim to glow at a constant brightness as a highlight of the avatar, set Environment Adapt to 0 for the constant emission as before.
Environment Adapt takes effect only on the side darker than being well lit by white light. It is by design that moving the light a little in a bright world produces no change (so bright places keep the same look as before). To see how it works, bring the Directional Light's Intensity close to 0 or switch to a dark Skybox, and the change becomes clearly visible.
About Environment Tint: This adjusts hue rather than brightness toward the environment, and can be used independently of Environment Adapt. It extracts the color of the surrounding light and applies only the hue to the rim color, so brightness never drops twice. The default is 0 (color unchanged). The effect is clearest with white to pale rims (with an already deep-colored rim the change can be hard to notice). If you are aiming for "never out of place anywhere" while travelling between worlds, use it together with Environment Adapt; if you want to protect the character's colors, leaving it at 0 is the safer choice.
Note: Multiply takes effect only in Lit (Unlit OFF) (because Unlit Mode does not respond to light). The Add rim-light emission fades in/out following the particle color's alpha (Fade/Additive, and during Transparent particle lifetime fade).
Back Light
An illustration-style backlight expression that makes a wide area of the outline glow only when the main directional light is behind the character. Whereas Rim Light "always glows at the edge depending on the viewing angle", Back Light "glows only when the light is behind", and in addition the parts where the light is blocked by shadow do not glow (places the backlight cannot reach because the body blocks it, such as the inside of a jacket or the collar, do not emit). The result is a natural backlight that responds to the scene's light direction and occlusion.
| Property | Description |
|---|---|
| Use Back Light | Enables/disables the feature. |
| Back Light Color (HDR) / Intensity | The color and strength of the backlight. Being an HDR color, it glows strongly when combined with Bloom. |
| Width | The extent of the glowing area. The smaller it is, the wider the area that glows; the larger, the narrower the band near the outline. |
| Directivity | The directivity used to decide that "the light is behind". The larger it is, the more it glows only when the light is almost directly behind; the smaller, the more it also responds to light coming from diagonally behind. |
| Environment Adapt | Weakens the backlight to match the surrounding brightness (ambient light + the main light). This keeps the backlight from looking out of place in dark worlds. The value is the degree of "how much it is affected by the environment": 1 (default) follows it fully, 0 gives constant brightness as before. In places at least as bright as being well lit by white light, the look is the same as before, and it weakens the darker it gets from there. This is the same mechanism as the item of the same name in Rim Light. |
| Dark Floor | The lower limit of how much backlight remains in pitch-dark places. 0 (default) turns it off completely; around 0.2 keeps a faint glow even in darkness. Use this value to adjust when you feel it weakens too much in dark worlds. It is shown only when Environment Adapt is greater than 0. |
| Environment Tint | Blends the hue of the surrounding ambient light into the backlight color. In cool-lit worlds it shifts bluish, and in warm-lit worlds it shifts warm. 0 (default) leaves the color unchanged. Because it shifts only the hue without changing brightness, it does not darken twice when combined with Environment Adapt. |
| Disable on Backface | With double-sided rendering (Cull = Off), does not produce backlight on backface meshes. Default is OFF. |
Difference from Rim Light: Rim Light glows "at the edge relative to your view" regardless of the light direction. Back Light looks at the direction of the scene's main directional light and glows only when the light is behind the subject, and furthermore the parts blocked by shadow do not glow. You can also use both at the same time.
The occlusion test for the light uses the world's shadows. In worlds without shadows (environments where shadows are disabled) occlusion does not work and the test uses only the light direction, so light can appear even on the inside of a jacket. It is also disabled in Unlit Mode (because it does not respond to light; the same treatment as Rim's Multiply).
Back Light used to decide its result only from "is the light behind" and "is it blocked by shadow", so weakening the light's strength did not change how bright the backlight was. With Environment Adapt (default 1) it weakens automatically to match the surrounding brightness and blends into the scenery even in dark worlds. The look in bright worlds does not change, so the only place that needs adjusting is dark ones. To see how it works, bring the Directional Light's Intensity close to 0 or switch to a dark Skybox, and the change becomes clearly visible. It is exactly the same mechanism as the item of the same name in Rim Light, so the same tuning sense applies when you use both.
Note: The emission fades following transparency (hlFade). Since the effect is based on the main Directional Light, it does not glow if the world has no Directional Light. "Disable on Backface" is meaningful only when Cull = Off (double-sided) (the same idea as the options of the same name in Rim / Matcap).
Outline & Sweep
# Outline
A base feature that draws the mesh outline. It handles everything from a toon-style edge to a glowing outline like a neon tube via HDR color + Bloom. It supports any 3D mesh — spheres, cubes, text, costumes, props, and more — and on skinned meshes it also follows animation. The basic outline can be drawn without a texture or UV unwrap (a mask is optional: use a mask image only when you want to erase the line partially, such as around the corners of the eyes).
| Property | Description |
|---|---|
| Use Outline | Enable/disable the feature. |
| Base Color (HDR) | The outline color. Being HDR-capable, raising Intensity makes Bloom (the light bleed) work nicely. The A (alpha) is the opacity of the outline itself (effective since v34; default 1 = opaque). |
| Self-Illuminate | The degree to which the outline self-illuminates, ignoring the world lighting (0–1; default 0). At 0 (default), the outline uniformly follows the scene brightness (total of the main Directional Light + ambient light, following Light Min/Max Limit) (bright (white) when a Directional Light is present; gray to black only when the whole scene is dark; the line is uniform and shows no light/dark boundary; in full darkness it stops at Light Min Limit and turns off at 0). At 1 it ignores lighting and emits constantly (classic neon). Adjust the glow strength with the brightness of Base Color (HDR). Animatable. ※ This value governs how the following Intensity / Line Width take effect (the brightness baseline), so it is placed right after Base Color so you can decide it first. |
| Intensity | The strength of the line's emission (0–16). |
| Line Width | The thickness of the outline (the mesh extrusion amount). The slider is 0–20 (in 0.01 steps, to two decimal places); 0 makes the line disappear. This range is intended for fine-tuning thin lines. (The displayed value is a convenient multiplier of the internal value; the effect and the meaning of the saved value do not depend on the magnitude of the display.) |
| Extrude Mode | Normal = along the normal direction (for beveled text / multi-part meshes such as text strings / smooth general models) / PivotScale = outward from the pivot (for hard-edged single convex shapes such as cubes; corners do not split). |
| Alpha Sync (follow material alpha) | On semi-transparent presets (Transparent / Fade / Additive), makes the outline follow the body’s transparency (Color’s A × the main texture’s A) (default ON). The more the body is see-through, the fainter the outline color seen through the body becomes as well, and no line appears on fully transparent parts (no depth is written either). OFF keeps it always shown regardless of transparency (the previous look, with the outline color showing through the inside). On opaque presets (Opaque / Cutout) the body is not see-through, so it has no effect. |
| Use Outline Mask (erase partially with a mask) | A feature to erase the outline partially with a texture mask (default OFF). You can erase only the places where you do not want a line, such as the corners of the eyes or the mouth. Turning it ON reveals the mask field below. |
| Outline Mask | A grayscale mask image. White = line / black = no line (midtones are a gradient). Sampled with the same UV as the main texture. Areas erased by the mask do not write depth, so see-through of the back side when semi-transparent does not increase. |
When you enable Outline, it starts with easy-to-handle initial settings (Intensity 1 / Line Width 0.1 / Sweep OFF). You can freely change the values afterward. Note that if you turn Outline OFF once and re-enable it, it returns to these initial settings.
The outline is drawn geometrically by the method of "drawing only the backfaces of a slightly inflated duplicate of the mesh" (inverted hull). Therefore, a correct outline appears even on a flat mesh such as a cube.
Normal: Because it extrudes along the normal, the line thickness is uniform. On hard-edged (flat-shaded) corners, the line may break. In that case, switch to PivotScale, or add bevels/smooth normals on the model side.
PivotScale: Because it extrudes radially from the pivot, corners do not split, but on multi-part meshes such as text strings or on concave shapes, the line thickness becomes non-uniform (no line appears on the side facing the pivot). Consider it exclusively for single convex shapes.
- The outline follows the bone deformation of skinned meshes. Use Normal for Extrude Mode (
PivotScalebreaks down on full-body meshes). - The line thickness scales with the avatar's scale (the visual ratio is preserved even on giant/tiny avatars).
- For parts where you do not want an outline, such as the face, turn Outline OFF on that material (or set Line Width to
0). Since avatars typically have separate materials per part, this is the basic means of per-part control. If you want to erase only a part within a single material, such as the corners of the eyes, use Use Outline Mask (white = line / black = no line). - The vertex processing of the relevant material roughly doubles, and one draw call is added. It is within practical range even at body scale, but if you prioritize Performance Rank, narrow the scope of application.
# Sweep (orbiting-glow option)
An option in which an especially bright glow streak orbits all the way around on top of the Outline. Usable for "light running" staging such as neon tubes, cyber gadgets, and magic circles. It works only when Outline is enabled.
| Property | Description |
|---|---|
| Use Sweep | Enable/disable the option. |
| Base Glow | The base brightness of the foundation on which the orbiting streak runs — the outline (tube) (0–1; default 1). Lowering it creates the contrast of "a strong light streak running over a faintly glowing tube". A Sweep-only setting (shown when Sweep is enabled). Turning Sweep OFF disables Base Glow, and the outline becomes a uniform solid line (brightness adjusted by Intensity and Base Color). |
| Width | The total length of the light streak. The smaller, the more point-like; the larger, the longer it glows. |
| Sharpness | The sharpness of the falloff applied symmetrically to both sides from the streak's center. The larger, the more sharply the center stands out; the smaller, the more gently the whole glows. |
| Speed | The orbit speed. The sign reverses the orbit direction (positive = one way / negative = the other way). 0 = stop. Animatable. (The displayed value is a convenient multiplier; the effect and the meaning of the saved value do not depend on the magnitude of the display.) |
| Count | The number of streaks orbiting at once (an integer 1–8). At 2 or more, evenly-spaced multiple lights chase each other. |
| Pivot Offset | The offset of the center around which the streak orbits (object space). Normally you can leave it at (0,0,0). When using it on the avatar body, set Y to chest height (e.g., 1.0) to make the orbit even. |
| Edge Fade | When, in semi-transparent modes (Transparent / Fade), the Sweep is seen bleeding radially through the body, this keeps the rim streak while suppressing only the inner bleed (0–8; default 2). 0 = disabled. A feature for smooth curved surfaces (spheres, organic meshes). In opaque, the back is hidden by the body, so there is no effect. ⚠️ On hard-edged meshes (cubes, etc.) the rim streak is attenuated too, so set it to 0 in that case (the outline itself is unaffected by Edge Fade and is always displayed). |
Because the light streak's position is generated by the angle on screen as seen from the camera, no matter which direction you look from, the streak circles the outline currently visible. Since it is a view-based (viewer-side) effect, tilting your head (camera) rotates the orbit's starting point together with the screen. Also, in VRChat mirrors the orbit direction appears reversed, but this is a specification common to view-dependent effects such as Matcap.
- When using this material on particles, the outline is drawn for each individual particle, so OFF is recommended for particle usage (when ON, the line follows the lifetime fade).
- Because this feature does not use shader keywords, enabling it does not increase the compile time (number of variants) at upload. When OFF, the drawing load is essentially zero, but one draw call is added for the dedicated pass.
- With Transparent / Fade presets, when the body becomes semi-transparent, the back may be seen through the body. The outline itself is always displayed (because it is drawn geometrically, it never disappears on any mesh). If the radial bleed of Sweep bothers you, on smooth curved surfaces the Sweep Edge Fade (default
2) suppresses the inner bleed (on hard-edged meshes,0is recommended).
Animation & Particles
# Particle Color (integration with particles)
| Property | Description |
|---|---|
| Vertex Color Blend Mode | Default is None (does not reflect the particle vertex color). Changing it to Multiply receives the color from the Particle System (Color over Lifetime, etc.). |
How to control from animation
By adding the following property names to keyframes in the Unity Animator, you can animate effects over time.
Steps (VRChat Avatar example)
- Open the Animator Controller
- With the target GameObject selected, add a keyframe
Add Property→Skinned Mesh Renderer(orMesh Renderer) →Materials→ target material → add by the property names above
About using with the Particle System
This shader is designed with use on particle effects in mind.
- Set this material to the Particle System's
Renderer > Material - Change the material's
Vertex Color Blend ModetoMultiply
That is all it takes. No additional settings such as checking Enable Mesh GPU Instancing or Custom Vertex Streams are required at all.
Performance & License
Performance & Optimization
This shader is maximally optimized for lightweight operation and compile speed in the VRChat environment.
- Drawing passes not used for avatar purposes (ShadowCaster, Deferred passes) and internal variants for fog/lightmaps are completely purged, greatly shortening build (upload) time.
About VRChat Fallback
The shader has the "VRCFallback" = "Standard" tag set.
Even if a custom shader is disabled by another user's Safety settings within VRChat, it is automatically replaced with Unity's built-in Standard shader, preventing the avatar from turning pink (material error).
References & Acknowledgements
In developing ARLitToon, we referenced the specifications and design of the following prior shaders and libraries. We extend our respect and gratitude to each project and author who has published such excellent work.
- lilToon (lilxyzw) — Referenced for avatar-oriented toon-expression feature specifications. https://github.com/lilxyzw/lilToon
- OpenLit (lilxyzw) — Referenced for lighting settings, particularly the approach to brightness control (handling of additional lights and upper-bound clamping) in environments with many realtime lights. https://github.com/lilxyzw/OpenLit
- Unity Built-in Shaders (Unity Technologies) — Unity's standard lighting pipeline is used to resolve ambient light and environment reflection (Global Illumination / reflection probes).
- AudioLink (the AudioLink project) — The music-reactive emission feature is implemented in compliance with AudioLink's specification (the globally-provided audio data texture supplied by the world). https://github.com/llealloo/audiolink
This shader does not reuse the above code as-is; it is an original implementation referencing their publicly available specifications and design philosophy.
License (Terms of Use)
The original Japanese text is authoritative. The following is an English translation provided for convenience. In case of any discrepancy in interpretation, the Japanese original prevails.
# English translation (for reference)
The copyright of this shader belongs to ARL. By purchasing or downloading this package, you are deemed to have agreed to the following Terms of Use.
# [Permitted]
- Incorporation into and commercial use of your own VRChat avatars, worlds, game production, etc. (including video streaming and the like).
- Modification of this shader's code and GUI script.
- When using this shader, crediting the author name (ARL) or the shader name (ARLitToon) is optional (not required).
When you bundle and distribute/sell the ARLitToon shader with a work (avatar, gimmick, world item, etc.), be sure to bundle the following 3 files as a set so the shader works correctly.
ARLitToon.shader(the shader itself)ARLitToonGUI.cs(the GUI script for the material Inspector / inside theEditorfolder)README.md(this guide)
※ If ARLitToonGUI.cs is missing, the custom Inspector GUI will not be displayed and the material cannot be configured correctly. Bundle README.md to convey the usage and these Terms of Use to the recipient.
ARLitToonBaker.cs(the texture baking tool / inside theEditorfolder)
※ This one is not required, but bundling it is recommended. If you bundle it, the recipient can use Bake to Base (baking) as well. Even without it the shader works perfectly normally; only the baking feature becomes unavailable.
※ In the unlikely event that this single file prevents Unity from compiling (version differences, conflicts with other assets, and so on), deleting ARLitToonBaker.cs restores everything. That is exactly why it is not required.
# [Prohibited]
- Unauthorized redistribution, reposting, or sale of this shader (including modified versions) by itself (however, bundling it with your own work for sale/distribution is fine).
- Uploading an avatar that uses the ARLitToon shader as a "Public Avatar" in VRChat or similar (putting it in a state where third parties can clone/extract the avatar).
# [Disclaimer]
- The author (ARL) assumes no responsibility whatsoever for any trouble or damage arising from the use of this shader.