Paint textures directly on your avatar in the Unity Scene view, the way Blender’s Texture Paint mode works. It has hard and soft brushes, a blur brush, a colour blend brush, an eraser, a gradient line tool, and a Photoshop style layer stack. Painting works in 3D, so strokes stay continuous across UV seams and land correctly on mirrored or overlapping UVs and on any UV channel.
Built for VRChat avatar creators on Unity 2022.3.22f1 (DX11, Built-in render pipeline, Linear colour space). The tool is editor only. It adds no components to your avatar and never touches your material assets while you paint, so uploads are unaffected.
With the VRChat Creator Companion: open the
package listing and click
Add to VCC, or add https://toffelskater.github.io/VRC-Texture-Painter/index.json
under Settings > Packages > Add Repository. Then add VRC Texture Painter to
your project under Manage Project.
Manually: download the .unitypackage or .zip from the
latest release.
Import the .unitypackage, or unzip the .zip into your project’s
Packages/com.vrctexturepainter.tool folder.
Then open Tools > VRC Texture Painter.
_MainTex) and the UV channel (usually UV0).Body_EmissionMask.png), and add a number instead of replacing an existing file. The folder is remembered per project..mtpaint project with every layer, so you can keep editing later.| Tool | Key | What it does |
|---|---|---|
| Hard | 3 / Num 1 | Solid, antialiased disc |
| Soft | 4 / Num 2 | Smooth falloff; Hardness sets the size of the solid core |
| Blur | 5 / Num 3 | Moves each texel towards the average of its neighbourhood. Blur Size sets the kernel width |
| Blend | 6 / Num 4 | Blends the colours under the brush into a smooth, seamless transition. Blend Width sets how long the gradient is; Flatten mode pulls the area towards one average colour instead |
| Eraser | 7 / Num 5 | Removes paint from the layer (makes it transparent) |
| Gradient | 8 / Num 6 | Drag from one point to another to paint a straight line of the set Width, coloured from the first colour at the start to the second colour at the end |
| Custom | 9 / Num 7 | A brush whose dabs take the shape of a black and white texture (the Brush Tip), for splatter, chalk, fur strands or patterns. Rotation keeps every dab at the Angle, turns the dabs with the stroke, or turns each dab randomly. Erase erases in the shape of the tip |
| Stamp | 0 / Num 8 | Places one black and white texture where you click, for symbols, logos and patterns. Keep the button down to move it; it is placed when you release |
Hard, soft, eraser and custom strokes use Opacity the way Photoshop does: a stroke never builds up past its opacity, however often you go over the same spot. Blur and blend use Strength per dab.
The Gradient works like the line tool in Krita, but fills the line with a
gradient instead of one colour. Press where the line starts and drag to where it
ends. The line updates on the model while you drag and is painted when you
release. Hold Shift to snap its angle to 15° steps, and press Esc to cancel it.
The gradient only covers the line, not the whole texture, and the line has flat
ends. Hardness softens its long edges, and Mix Colors In sets how the two
colours blend. The line is always measured on screen, so Falloff Shape and pen
pressure do not apply to it.
Six stamps come with the painter: star, heart, sparkle, moon, paw and flower. Click one under Defaults to use it; the Stamp starts with the star. They work as brush tips for the Custom brush too, for example sparkles with random rotation.
Custom and Stamp use any texture in the project as their shape: white paints, black leaves the surface as it is, grey paints partly, and transparent parts never paint. Turn on Invert for black symbols on a white or transparent background. Size is the longer side of the texture on screen, Angle turns it counterclockwise, and the texture is always laid flat on the screen, so Falloff Shape does not apply. Occlusion, backface culling, normal falloff and mirror work as usual (the mirrored copy is a mirror image).
The Blend brush reads the colours as they were when the stroke started. Dragging it across a border blends that border into a gradient without carrying colour along the stroke (no smearing), and going over the same spot again only brings it closer to the finished gradient.
Mix Colors In (Blur, Blend and Gradient) decides how colours are averaged:
Stroke options
Every paint stroke and layer operation is on Ctrl+Z / Ctrl+Y through Unity’s normal undo. History is kept on the GPU, 30 steps by default.
The window has two tabs. Texture Painter is the colour painter described above. Mask Painter paints the mask textures of a shader.
_MainTex, or the slot the
shader marks as [MainTexture]), lilToon’s _Main2ndTex and _Main3rdTex, and
Poiyomi decal textures. Every other slot,
such as Poiyomi’s _EmissionMask, Standard’s _DetailMask or a normal map, is
listed here. A slot without a texture starts black.Masks mix instead of replacing each other. R, G and B each change only their own channel, so painting red and then green over the same spot gives red + green (yellow), and both masks are kept. White raises every colour channel, Black clears every colour channel. Alpha is never painted and stays as it is.
| Tool | Key | On a mask |
|---|---|---|
| Hard / Soft | 3 / 4 | Move the selected channel(s) towards 1 (Black: towards 0), up to the opacity |
| Blur | 5 | Softens only the selected channel(s) |
| Eraser | 7 | Takes the selected channel(s) back to 0 |
| Gradient | 8 | A line from the mixed R / G / B colour at its start to black at its end |
| Stamp | 0 | Stamps a black and white texture into the selected channel(s) |
| Input | Action |
|---|---|
| Left drag | Paint |
[ / ] | Smaller / larger radius |
Shift + [ / ] | Less / more strength |
Ctrl + scroll | Radius |
Ctrl + Shift + scroll | Strength |
3 – 9, 0 or Num 1 – 8 | Hard, Soft, Blur, Blend, Eraser, Gradient, Custom, Stamp |
Shift while dragging a gradient | Snap the line to 15° steps |
C or Num 0 | Pick the colour under the cursor |
Right mouse + WASD / QE | Fly through the scene as usual; painting keys are ignored meanwhile |
Esc | Cancel the current stroke |
Ctrl + Z / Ctrl + Y | Undo / redo |
The painting keys avoid everything Unity 2022.3 binds in the Scene view by
default (Q–Y tools, WASD/QE fly mode, 2 for 2D mode, F, V, X,
Z, H, L, P). Numpad keys need Num Lock on. With it off, Windows sends
arrow keys and Delete instead, and those move the camera or delete the selection.
While painting, Unity’s transform tools stay switched off, so an accidental Q
(View tool) can’t turn left drag into panning.
Some avatars show different textures through different UV channels on the same material. A common setup is a Poiyomi body material whose main texture covers the body on UV0 while a decal draws the face texture through UV2. In Blender the head’s UV0 and the body’s UV2 are then left empty (collapsed).
Add one entry per texture under Textures before you start painting. Poiyomi decals on the material are offered as + Decal buttons, with their UV channel already filled in. An info box also tells you when triangles would not receive paint and which UV channel they use instead.
While painting:
Decals must sit at their default placement (position 0.5 / 0.5, scale 1, rotation 0, no tiling). Otherwise the setup shows a warning, because strokes would land offset from where the decal is drawn.
Most in-editor painters ray cast the cursor to a single UV coordinate and stamp a circle into the texture. That approach breaks at UV seams, distorts on stretched islands, and misses the other copies of mirrored or stacked UVs. This tool works in reverse:
So a stroke crossing a seam paints both islands, since both sides are near the brush in 3D. A texel shared by several faces (mirrored or overlapping UVs) takes paint from whichever face is under the brush, and brush size stays constant however the UVs are scaled.
The blur and blend brushes read colours from a small capture of the model around the brush. That capture is continuous across seams, so blurring over a seam smooths it instead of leaving a line.
Seam padding extends painted colour a few texels past island borders in the preview and the exported file, so mip maps and bilinear filtering don’t show thin lines along seams. The default is 16 texels, and you can change it under Output.
Library/MeshTexturePainter/ and restored when you return to Edit mode.The GitHub repository has a
GPU test suite in Assets/MeshTexturePainterTests, which is not part of the
installed package. It covers brush placement, seams, padding, blur and blend,
occlusion, blend modes, gradients, masks, multiple textures, undo, save/load, export and skinned
meshes. Run it headless in the repository’s Unity project. It quits Unity when
done and returns exit code 0 on success:
Unity.exe -batchmode -projectPath <repository> -executeMethod MeshTexturePainter.Tests.MTPTests.Run -logFile test.log
Search the log for MTPTEST. The suite creates and deletes temporary assets, so
don’t run it in an avatar project.
.mtpaint files hold a JSON header (target renderer, UV channel, slots,
texture property, padding, texture or mask project) and one PNG per layer. A mask
project always opens in the Mask Painter tab. You can store them inside or
outside Assets. When you open a project, it finds its renderer again by object
id or hierarchy path. If that fails, select the renderer first.
com.vrctexturepainter.tool
1.2.0 (Changelog)
2022.3 or later
No dependencies
No dependencies
No legacy packages