[Bug]: surface-pass acceptance is unreachable by normal mapping on a low-albedo matte material
Before submitting
- I searched existing issues and did not find a duplicate.
- I confirmed this is a reproducible behavior problem, not a request for help using the project.
What happened?
surface-pass acceptance asks that a grazing-angle close-up prove normal/height detail
"breaks highlights naturally and does not read as smooth plastic". On a near-black matte
material that cannot be met by normal mapping at any plausible strength, so the pass is
unreachable rather than merely unmet.
Reproduction steps
- Build any hard-surface prop whose body material is a matte near-black elastomer —
albedo around
#1A1B1D, roughness 0.85, normal map only, no displacement. - Capture a grazing-angle close-up (a low directional key, environment pulled down).
- Measure high-frequency content in the lit band and compare with the reference.
Reference image or input characteristics
Matte black injection-moulded elastomer, photographed as a studio product render. This is the dark-on-dark case: the marks carry no colour signal at all, only shading.
Relevant output and evidence
Measured with a 9 px high-pass on the lit band, normalised by that band's own mean level:
| normalised high-frequency residual | |
|---|---|
| reference, side | 0.0213 |
| reference, bottom | 0.0630 |
| render, as authored | 0.0046 |
| render, after normal strength 0.22 -> 0.5 and tiling 2 -> 12 | 0.0053 |
The normal map was verified reaching every visible mesh with 0..1 UVs, correct normalScale
and repeat, so this is not a wiring fault. It is physical: at that albedo and roughness the
lit band sits at luminance ~70, where a few-percent normal perturbation moves one or two
levels out of 255. There is no headroom for the detail to live in.
Suggested fix:
- Note in the pass's acceptance criteria that on low-albedo matte materials the normal path cannot satisfy it, and point at displacement.
- If a numeric threshold is ever attached to this pass, normalise it by the lit band's own level, and measure a flat relief-free region of the reference first, to establish how much of its residual is compression noise rather than relief.
A related note on the same material. Its reference-derived roughness map averaged 0.70 and laid a hard specular band across the body, which had been corrected by pinning roughness to a flat 1.0. That over-corrects: at 1.0 the lobe is so broad that no normal detail can modulate it at all. Restoring the spec's measured 0.85 with the map still null moved the body's peak/floor contrast from 1.36 to 1.69 against a reference of 2.40, and narrowed the highlight from 71.6% of body width to 50.0% against the reference's 33.0%.
Environment
img2threejs v1.5.1. Subject: hard-surface prop, matte black injection-moulded elastomer.
Source: img2threejs/img2threejs