A pretty popular and accessible way of creating custom avatars for VRChat is by using Vroid Studio, a program mostly used to create character models for vtubers. Unfortunately, VRChat has pretty strict limitations on how avatar models can actually be constructed and displayed in a session without setting people’s computers on fire1, and Vroid models by default will flagrantly ignore all those limitations in the pursuit of making your brand new anime femboy self-actualisation vehicle as cute as programmatically possible. There are processes for optimising your Vroid avatar so that it will play nice in VRChat, but actual step-by-step guides for such processes are largely relegated to YouTube videos made by small-time vtubers2, and I would prefer a written guide that’s generally easier to scroll through, so I’m making that in case anyone else has the same brain worms that I do.

Necessary Programs

  • Vroid Studio v1.16.0: To create your model as well as perform some preliminary optimisations.
  • Blender 2.83.7: To further optimise the model, as well as convert it to a VRChat-friendly format. We’re using this release of Blender specifically because it is tested and compatible with the plugins listed below.
  • Unity 2019.4.31f1: The version of Unity which VRChat’s documentation says it supports. I have no idea if less ancient versions are supported, but I’m not game enough to try. Install through Unity Hub.
    • VRChat SDK3: This will allow you to upload your model directly to VRChat from Unity.

Step 0: Create your model in Vroid Studio

In case you don’t have a model to go already. Be as self-indulgent as you want, but keep in mind that you’re likely going to be paring down the model a fair bit to keep it within acceptable construction limits, so don’t go too overboard.

Step 1: Preliminary optimisations in Vroid Studio

Click the “export” button in Vroid Studio (top right corner, arrow pointing out of a box) and select “Export as VRM”. This will take you to the export menu, where you can view final settings before exporting – we won’t actually be exporting the model just yet.

First, open the “reduce polygons” drop-down menu and ensure that “delete transparent meshes” is checked. You can then use the sliders underneath to adjust the polygon count for different sections of the model – try to find a balance between polygon count and visual fidelity. The main areas of high polygon count will be the hair, hair smoothness and outfit, as these are usually the most complex sections of the model. It isn’t completely necessary to reduce polygon count in the face and body, but it can’t hurt to do so if you think you can get away with it.

Next, open the “reduce materials” drop-down menu. If your model does not have elements like wings or a tail, check the “combine hair mesh” box. The rest of the work on materials and bones will be done using Blender. Export the model and ensure that your Blender installation is prepared with all of the listed plugins.3

Step 2: Optimisations in Blender

Create a new project by selecting File > New > General. Delete the default objects (press A and then X on your keyboard), then expand your sidebar by clicking on the < symbol next to the layer list. Navigate to the CATS tab, then click the triple-bar icon on the “Import Model” button and select “VRM” – this is how we’ll import our Vroid model into Blender.

2.1: First Auto-Fix

Once your model has been imported, click the wrench icon on the “Fix Model” button and ensure that all checkboxes but the first three (“Keep End Bones”, “Keep Upper Chest” and “Keep Twist Bones”) are selected. Click “OK”, and then “Fix Model”.

After this process has finished, expand the “Armature” menu in the right panel, and select your “Body” mesh. Press TAB to enter Edit Mode, and enable X-Ray Vision (press Alt+Z or click the icon with two squares in the top right of the workspace). Left click and drag over your model to select everything. Once everything is selected, click “Face” on the top left of the workspace, and select “Tris to Quads” – this will make the editing process much easier, as quads generally make more sense visually than tris.

2.2: Delete transparent meshes

Next, press TAB to return to Object Mode, and select the “Body” mesh again in the right panel under “Armature”. Select “Model Options” under the CATS tab and then select “Materials” as your “Separate by:” option. This will separate the combined mesh into distinct meshes by material, which will allow us to edit the body and hair meshes separately.

Once your meshes have been separated, select your body mesh (now named N000_000_00_Body_00_SKIN (Instance) or something similar) and return to Edit Mode. Our goal here is to reduce polygon count by deleting meshes that are hidden underneath our model’s clothes. Ensure that X-Ray Vision is still enabled, then change the selection tool at the top left of the workspace from box to circle (press W to switch). Select all of the mesh hidden under your model’s clothes, as well as the parts of your model’s head that are covered by hair with Shift+left click. If you select an unwanted section of the mesh, Ctrl+left click will deselect specific portions of the mesh. Once all these parts of the mesh have been selected, press P and then select “Selection” from the dialog box to create a new mesh from that selection. Delete that new mesh, and this will have deleted the selected parts of the mesh. Repeat this process as many times as necessary until the body mesh only consists of parts not covered by clothes.

2.3: Decimate hair meshes

This step is completely optional, as most of the optimisations have already been made in Vroid Studio.

You can then select your hair meshes and apply the Decimate tool by selecting Modifier Properties (wrench icon) > Add Modifier > Decimate (under Generate). This will achieve a similar effect to the optimisations made in Vroid Studio. Try to find a balance between polygon count and visual fidelity, but keep in mind that changes can only be viewed while in Object Mode.

2.4: Re-merge body meshes

Finally, select all of the meshes in the right panel, and then in the top left of the workspace, select Object > Join. Make sure to rename (right click mesh > ID Data > Rename) the resulting mesh to “Body”, to avoid errors when exporting the model.

At this point, you may choose to test your model’s blend shapes by selecting the Body mesh, selecting the Object Data Properties panel (three squares arranged into a connected triangle) and then under Shape Keys, setting the values for individual options to 1 to test various facial experessions.

Note that a handful of the blend shapes may not play nice when importing the finished model into Unity (in my experience, it was the “Fung” blend shapes), so after testing the blend shapes and finding any that either don’t behave in expected ways, or just don’t do anything, uncheck them to exclude them from the final exported model.

2.5: Set eye tracking

Next, under the CATS tab, select the “Eye Tracking” drop-down menu, and ensure that the Head, Left Eye and Right Eye are all assigned the correct bones (this will likely be the case by default). Then, set your Blink Left and Blink Right to the right blend shapes (Fcl_EYE_Close_X where X is either L or R). Then select “Create Eye Tracking”. If Blender returns an error, don’t worry about it, as this doesn’t really have any significant effects on the model. You can then switch from “Creation” to “Testing” in the Eye Tracking menu and test your model’s eye movements and blinking.

2.6: Set mouth movements for speech

Open the “Visemes” drop-down menu, and pick blend shapes corresponding to each particular sound. Visemes AA and OO have pretty easy picks (Fcl_MTH_A and Fcl_MTH_O respectively), but since there is no blend shape that fits Viseme CH most easily, you can take your pick out of all the blend shapes – common ones are Fcl_MTH_E or Fcl_MTH_I. Select “Create Visemes”.

2.7: Atlas materials

Open the “Optimisation” drop-down menu and ensure “Atlas” is selected. If the menu only gives you a button to “Install Pillow”, click that button, then save your project and restart Blender to continue. Once this is set up, select “Generate Material List” to create a list of all textures on the model. From here, you can select different groups of textures to be atlased (combined) if you would like to apply different shaders to different parts of the model. If you don’t really care about that sort of thing (like me), just combine everything into one atlas to have the same shader applied to all of them. Before saving your atlas, it is a good idea to save your Blender project to its own discrete folder, so that the atlas can be saved to the same location. Once this is done, select File > External Data > Unpack into all files, to ensure that your textures are all unpacked within the project location. This will ensure correct atlasing of your textures.
Finally, select “Save Atlas to…” and save your texture atlas to the project location.

2.8: Knee alignment

There is a potential issue with some models in VRChat that will cause their knees to bend inwards when in a crouching position. To remedy this, select the “Armature” in the right panel, enter Edit Mode, and then click and drag the two knee joints on your character’s model. Then, select one of the red X-axis points on the diagram at the top right of the workspace to view the model from the side. Press G to activate the move tool, then left-click to begin moving the joints. Bend them slightly outward from the model, and then left-click again to set the position.

2.9: Export Model

All optimisations have been completed! Now, select “Export Model” from the CATS tab, set the Path Mode on the right of the dialog window to “Copy”, and ensure the “Embed Textures” icon next to the drop-down menu is selected. Select “Export FBX”, and your model will be exported and ready to be imported into Unity for upload!

Step 3: Upload model to VRChat via Unity

Create a new 3D object project in Unity via Unity Hub, and then import your FBX model. Before moving it into the scene, go into the “Materials” tab of the model’s Import Settings on the right panel, and use the appropriate buttons to extract the textures and materials into the project’s default directory. Next, select your material atlas and set the rendering mode to “Cutout”.
Next, go to the “Rig” tab of your model’s Import Settings, and select “Humanoid” from the drop-down menu next to “Animation Type”. Then, select “Create From This Model” from the drop-down menu next to “Avatar Definition”. This will ensure your model has appropriate animation data attached to it, since it doesn’t come with the model by default.
Finally, select the model within the workspace, click “Add Component” and search for “VRC Avatar Descriptor”. Apply it, and then click the “Edit” button next to “View Position” – this will allow you to set where your vision will stem from as your character in VRChat. Set it to your model’s eye level, ensuring that it’s centered. Click “Return” when finished.

Now, load VRChat SDK3 into your Unity project, and when the “Import Unity Package” dialog opens, click “Import” to complete the process. Click “VRChat SDK” at the top of the window, and select “Show Control Panel”. Log in with your VRChat account details, and once you’ve logged in, navigate to the “Builder” tab and apply any auto-fixes that you can, until your model reaches an Overall Performance rating of at least “Good”. Then, click “Build & Publish for Windows”, go through the upload process in Unity, and once you’re done, you’ll finally be able to log into VRChat and select your model as your avatar!

There was a lot of trial and error involved in this process for me4, and so I hope my having documented this process will help you some, too.


  1. This isn’t exactly the case, since no part of the model upload process can actually benchmark this sort of thing – it’s all just educated guesses on VRChat’s part. ↩︎

  2. Not that I’m knocking your hustle or anything. Most of this guide was actually based on a video guide made by Fazziesan↩︎

  3. Blender plugins are installed via the Add-Ons menu under Edit > Preferences. All plugins are installed from their .zip files, so there’s no need to unzip them before installation. Install the CATS plugin first, and then the other two, and make sure you enable the plugins after installation. You’ll be able to see they’re working once they appear as tabs on the expanded sidebar on the right. ↩︎

  4. As well as much appreciated help from Shiburizu and Kayin. Thanks a ton, you two! ↩︎