Control Avatar Colors with VRChat RGB Radial Puppets

An RGB control uses three Radial Puppets—red, green, and blue—to drive three independent shader inputs. Each radial outputs a Float from 0.0 to 1.0, and each FX Animator layer blends between a minimum and maximum Animation Clip.

The shader is the deciding factor. This workflow requires three separately animatable scalar properties. If the material exposes only one combined Color property, use one hue control or fixed color presets instead of making three Animator layers fight over the same property.

Three-Channel Color Control

Verify one shader channel from end to end, then repeat the same Blend Tree pattern for the other two channels.

  1. Confirm the shader exposes independent red, green, and blue inputs.
  2. Build two clips and one 1D Blend Tree for the red channel.
  3. Add the green and blue channels only after the red radial works in VRChat.

Video Walkthrough

Video creator: DedZedOffishal

Use the video for the Unity interaction. Use the channel map, Blend Tree settings, and test matrix below to keep the three controls independent.

Radial Puppet behavior

VRChat documents a Radial Puppet as one Float control with a 0.0 to 1.0 output. Closing the puppet leaves its radial value at the selected position until another control or animation changes it.

Choose the Correct Color System

Desired result Suitable setup
One continuous hue rotation One Radial Puppet driving a hue property
Brightness or emission strength One Radial Puppet driving one scalar property
Independent RGB mixing Three Radial Puppets driving three separate scalar properties
A few named colors A material-preset toggle or selector
One shader Color property with no channel inputs One hue/value control or fixed presets

For a single animated hue property, follow Animate an Avatar Hue Shift. For discrete appearances, use Select Avatar Materials with a Radial Puppet.

What You Need

  • A working avatar upload.
  • A material whose shader exposes the required animatable inputs.
  • One renderer and material element selected for the color change.
  • An Expressions Menu and Expression Parameters asset assigned to the avatar.
  • A custom FX Animator Controller assigned to the descriptor.
  • Two Animation Clips per channel: minimum and maximum.
  • A backup or version-control checkpoint for the controller and expression assets.

Shader property names are not standardized across avatar shaders. Inspect the material and the shader's own documentation before recording clips. The example names in this guide describe the role of each property; they are not universal Unity property names.

1. Verify One Shader Property

Duplicate the material before changing it. In the material Inspector:

  1. Find the scalar input that controls the red contribution.
  2. Move it from its minimum to maximum.
  3. Confirm the intended pixels change.
  4. Confirm green and blue remain unchanged.
  5. Return the material to its intended default value.

Do not continue with three channels if changing one input also rewrites the other two. The three Animator layers must control different recorded properties.

Safe and Unsafe Bindings

Recorded binding Three-layer RGB result
Red scalar property only Safe for the red layer
Green scalar property only Safe for the green layer
Blue scalar property only Safe for the blue layer
Entire combined Color property in all three layers Conflicting layers; the later layer can override the earlier result
Material reference swap Selects presets rather than mixing channels

2. Create the Red Animation Clips

Create two clips:

Color_R_Min.anim
Color_R_Max.anim

Record only the red scalar property on the intended renderer and material element:

Clip Red input Green input Blue input
Color_R_Min 0.0 Not recorded Not recorded
Color_R_Max 1.0 Not recorded Not recorded

Preview both clips in Animation Mode. The red contribution should change while the other channel inputs remain untouched.

Keep the material binding stable

The clip records a renderer path, material element, and shader property. Renaming or re-parenting the renderer, reordering its Materials list, or replacing the shader can break that binding.

3. Add the Red Float Parameter

Add the same parameter to the Expression Parameters asset and the FX Animator Controller:

Name: Color/R
Type: Float
Default: match the material's red starting value

Parameter names are case-sensitive. The custom expression parameter and Animator parameter must use the same spelling and Float type.

4. Build the Red 1D Blend Tree

In the FX Animator Controller:

  1. Add a layer named Color - Red.
  2. Set its weight to 1.
  3. Create one state from a new Blend Tree.
  4. Make that Blend Tree the orange default state.
  5. Open the Blend Tree and set its type to 1D.
  6. Set the blend parameter to Color/R.
  7. Add two Motion fields.
  8. Assign Color_R_Min at threshold 0.
  9. Assign Color_R_Max at threshold 1.

The layer does not need transitions because the default state continuously evaluates its Blend Tree. Scrub the Color/R value in the Animator and confirm the property blends between both clips.

Blend Tree field Value
Blend Type 1D
Parameter Color/R
Motion 1 Color_R_Min
Motion 1 threshold 0
Motion 2 Color_R_Max
Motion 2 threshold 1

5. Add the Red Radial Puppet

In the Expressions Menu:

  1. Add a control named Red.
  2. Set its type to Radial Puppet.
  3. Assign Color/R as its radial parameter.
  4. Add a red channel icon if one is available.

Confirm the avatar descriptor still references the menu, Expression Parameters asset, and FX controller you edited. Upload privately and test the red radial before duplicating the setup.

6. Add Green and Blue

Repeat the same pattern with different properties, clips, parameters, Animator layers, and menu controls.

Parameter Map

Color/R  Float
Color/G  Float
Color/B  Float

Asset Map

Channel Minimum clip Maximum clip FX layer Blend parameter
Red Color_R_Min Color_R_Max Color - Red Color/R
Green Color_G_Min Color_G_Max Color - Green Color/G
Blue Color_B_Min Color_B_Max Color - Blue Color/B

Each pair of clips must record only its own scalar property. Set all three FX layer weights to 1.

Menu Map

Menu control Type Parameter
Red Radial Puppet Color/R
Green Radial Puppet Color/G
Blue Radial Puppet Color/B

VRChat supports up to eight controls in one Expressions Menu asset. A dedicated Color Sub-Menu keeps the three channels together without consuming three slots on the avatar's top-level menu.

7. Set Defaults, Saved, and Synced

Set each parameter default to the value already visible on the material when the avatar loads. For a shader that treats RGB inputs as multipliers, that might be 1, 1, 1; use the shader's actual starting values instead of assuming that convention.

Option Enable it when Result
Saved The wearer expects the chosen color to persist VRChat retains the value after world or avatar changes
Synced Other players need to see the color VRChat sends the parameter to remote players
Neither The control is temporary or local-only The parameter returns to its configured default on reset

VRChat documents each synced Float as 8 bits of custom parameter memory. Three synced RGB channels therefore use 24 bits of the 256-bit custom sync limit.

8. Match PC and Mobile Versions

A mobile avatar may use a different shader. That shader must expose equivalent animatable inputs if the mobile version is expected to support the same RGB controls.

Item PC version Mobile version
Parameter order Color/R, Color/G, Color/B Same positions
Parameter types Three Floats Three Floats
Default values Match PC starting color Same visible starting color
Recorded properties PC shader inputs Equivalent mobile shader inputs
Menu meaning Red, green, blue Red, green, blue

VRChat synchronizes custom parameters between platform versions by parameter-list position and type, not by name. Use the same Expression Parameters asset for both versions when possible.

If the mobile shader cannot reproduce the feature, keep the same three parameters in the shared list and leave the mobile FX implementation inactive. This preserves the position and type of every later synced parameter.

Test Matrix

Test a private upload before publishing the avatar.

Test Expected result
Avatar loads with all defaults Material matches its intended starting color
Red radial moves from 0 to 1 Only the red contribution changes
Green radial moves from 0 to 1 Only the green contribution changes
Blue radial moves from 0 to 1 Only the blue contribution changes
Two radials use non-zero values Both channel contributions remain visible
All three radials change The shader combines all three inputs
Puppet closes Its selected value remains active
Avatar resets with Saved disabled Each channel returns to its default
World or avatar changes with Saved enabled Selected values persist
Another player observes Synced channels Remote color follows the selected values
PC version is viewed PC shader responds correctly
Mobile version is viewed Equivalent mobile inputs respond, or the feature stays intentionally inactive

Troubleshooting

Help! The radial moves but the color does not change.

Confirm the Radial Puppet, Expression Parameters asset, FX parameter, and Blend Tree all use the same Float name. Then preview both Animation Clips and verify that they record the intended shader property.

Help! Red works, but green or blue replaces it.

Inspect the clip bindings. If multiple layers record the same combined Color property, the layers conflict. Each channel needs its own independently animatable shader property.

Help! The radial only switches between two values.

Confirm the state contains a 1D Blend Tree rather than transitions between two normal states. The Blend Tree needs minimum and maximum clips at thresholds 0 and 1.

Help! The avatar loads with the wrong color.

Align the three Expression Parameter defaults with the material's starting inputs and the Blend Tree clips. Disable Saved temporarily when testing new defaults so an older retained value does not hide the change.

Help! Other players cannot see the selected color.

Enable Synced for the channels remote players need, then test with the uploaded avatar. Confirm the Expression Parameters asset remains within VRChat's custom parameter memory limit.

Help! The color works on PC but not on mobile.

Check the mobile material and shader. The mobile version needs equivalent animatable inputs and platform-specific clips; copying clips that target properties absent from the mobile shader will not reproduce the effect.

Help! One channel changes the wrong material.

Open that channel's minimum and maximum clips and compare their renderer path and material element with the intended target. Both clips must bind to the same correct element.

Help! The channel snaps or looks uneven to remote players.

VRChat transmits synced Floats with finite precision and uses puppet sync while the control is open. Judge remote behavior in an uploaded two-client test rather than relying only on local Animator preview.

Official References

Related Avatar Guides

Topics: VRChat RGB radial puppet, avatar color controls, FX Animator, 1D Blend Tree