Ordinary lighting math (diffuse = max(dot(N,L), 0)) produces a value that changes smoothly with angle. MeshToonMaterial re-looks-up that value in a small 1D texture called gradientMap — if the texture is stepped (say, 4 bands of gray), the lighting snaps between those steps too, giving the sharp banding that reads as cel animation. Setting the texture’s minFilter/magFilter to NearestFilter matters: otherwise the steps get interpolated and the bands blur together.
Outlines need a separate technique. The simplest is the "inverted hull": duplicate the same geometry, scale it up slightly (1.03–1.08×), and draw it behind the original mesh with a flat-color material set to side: THREE.BackSide. Only the back faces of this enlarged shell are visible, and they poke out just past the original mesh’s silhouette, reading as a black outline.
The demo shades a sphere with MeshToonMaterial and a 4-step gradient, then layers a black inverted hull behind it for a cartoon-character look.
When to use
Cartoon/anime-style characters, non-photorealistic game art.