I’ve made a tool to improve the shading of SkinnedMeshRenderers by recalculating select blendshape normals.

I’m gonna share what I learned from doing this.

Documentation:

Recalculate Normals | Haï~

JiHvKYMj8A.mp4

The tool is under the MIT License. Please use it freely under the terms of this license!

What are normals?

In short:

This vertical pole is a normal. It is a piece of information that is used to figure out the direction where that point would receive the maximum amount of light. If the sun is right above the pole, that vertex receives maximum light.

This piece of information is also used for reflections (if you look at the point from above the pole, you reflect yourself), and a ton of other stuff in shaders.

Blendshape normals in the context of VRChat

A blendshape deforms points of a mesh by moving them around.

Not only points are moved, but the normals also should be: Since the points move, then we need new information on how to tilt that vertical pole to match the new slant of the surface below it.

However, in the context of VRChat (actually, Unity, VRChat is not at fault here), there’s an issue.

There’s been a problem in Unity where: