Why MMD models look washed out in three.js: tone mapping, 7 modes compared
Tone mapping compresses colors that are too bright to fit on screen. It is standard in photorealistic 3D, but on toon-style MMD models it makes colors look washed out. This site used ACES by default for about two weeks and got the feedback that "it looks hazier and less saturated than before". Here are the 7 modes compared under identical conditions.
Conclusion
- If you want MMD models to keep their colors, do not use tone mapping (keep three.js's default
NoToneMapping). - ACES, AgX, Cineon and Reinhard all reduce saturation and contrast. On the model in a white outfit, ACES cut saturation by 47%.
- If you only want to avoid clipped highlights, Neutral is an option. It kept saturation and removed the pixels stuck at pure white.
How we measured
We rendered Alicia, who wears mostly white, and a Hatsune Miku-style model with mostly dark clothes, from the front at the same size. Lights were ambient 1.2 and directional 1.4, exposure (toneMappingExposure) was 1.0, and only renderer.toneMapping was changed. From the rendered image we took the non-background pixels and counted four things:
- Brightness: mean pixel luminance (0–255)
- Contrast: standard deviation of luminance; larger means stronger light and dark
- Saturation: mean HSV saturation (S); 0 is gray
- Clipped white: share of pixels with R, G and B all at 250 or more
Model in a white outfit (Alicia)
| Tone mapping | Brightness | Contrast | Saturation | Clipped white |
|---|---|---|---|---|
| None (NoToneMapping) | 200.3 | 48.8 | 0.133 | 7.5% |
| Linear | 200.3 | 48.8 | 0.133 | 7.5% |
| Neutral | 190.8 | 45.8 | 0.143 | 0% |
| ACESFilmic | 195.8 | 39.6 | 0.071 | 0% |
| Cineon | 186.6 | 36.9 | 0.076 | 0% |
| AgX | 174.7 | 33.8 | 0.072 | 0% |
| Reinhard | 158.6 | 32.2 | 0.090 | 0% |
ACES barely changed brightness but dropped saturation from 0.133 to 0.071, a 47% cut. The light blue stockings and blond hair turn grayish and the whole image looks hazy. AgX and Cineon lost about as much saturation, and Reinhard made everything darker.
Model in dark clothes (Miku-style)
| Tone mapping | Brightness | Contrast | Saturation |
|---|---|---|---|
| None (NoToneMapping) | 125.9 | 52.6 | 0.191 |
| Linear | 126.0 | 52.5 | 0.192 |
| Neutral | 114.9 | 56.6 | 0.248 |
| ACESFilmic | 130.3 | 55.2 | 0.164 |
| Cineon | 128.2 | 49.4 | 0.175 |
| AgX | 125.7 | 42.3 | 0.131 |
| Reinhard | 110.1 | 38.5 | 0.158 |
This model had no clipped whites to begin with (0% in every mode), and ACES lowered saturation by 14%. How much color is lost depends heavily on the model; the more bright colors, the bigger the loss. Testing only with a dark model underestimates the effect.
On this model Neutral actually raised saturation from 0.191 to 0.248, making the teal hair deeper. It is a candidate for taming highlights, but it does not reproduce the original colors exactly.
Why MMD models lose color
Tone mapping exists to squeeze the "far above 1.0" brightness of realistic lighting smoothly into what a screen can show. In our measurements, too, Alicia, who has more bright colors, lost much more saturation with ACES, AgX and Cineon.
MMD models produce the colors meant for the screen directly, from material colors and toon textures. three.js MMDLoader also puts the PMX diffuse colors into the materials as sRGB colors as they are. Applying a curve on top that pulls bright colors toward white makes the author's colors look faded. White and pale outfits sit near the top of the range already, so they are hit hardest.
On the other hand, without tone mapping 7.5% of Alicia's pixels were stuck at pure white, which means some shading on the white outfit is blown out. Among the 7 modes, Neutral was the only one that removed this clipping while keeping saturation.
What happened on this site
From 2026-09-22 to 10-08 this site used ACES, weak ambient light and a warm directional light by default as a "high quality lighting" mode. On Alicia from the front, saturation dropped from 0.134 to 0.078 and contrast from 48.5 to 36.3, and we only noticed after feedback that it looked hazier than before. The default is now back to no tone mapping.
The player uses ACES only when you set the brightness slider to something other than 1.0, to adjust brightness. To see the colors as they are, leave it at 1.0.
When changing a setting that affects the look, render before and after under the same conditions and compare pixels. Looking at one model by eye did not reveal that the colors had faded. Comparing at least two models with different color tendencies, such as a white outfit and a dark outfit, makes it harder to misjudge the size of the effect.