[Bug]: surface-pass acceptance is unreachable by normal mapping on a low-albedo matte material

Author: mariusargintCreated Aug 31, 2026Updated Sep 1, 2026
Labelstriage: needs-review

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

  1. 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.
  2. Capture a grazing-angle close-up (a low directional key, environment pulled down).
  3. 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:

  1. Note in the pass's acceptance criteria that on low-albedo matte materials the normal path cannot satisfy it, and point at displacement.
  2. 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.