There is a way to fix this, but have some caveats:
- It only works for still images.
- It only works for bumpmaps that depicts random bumps/normal changes.
- I haven’t figured out how to make it yet
So imagine a tiled floor. Each tile has a completely random color generated. This random color is then used to modify normal directly (not bump), which gives the impression of each tile being slightly inaccurately laid down (each tile not 100% planar). For the faces that face towards the camera, all is good. For the faces that face away from the camera, you can get black spots due to reflected normal now pointing into the object. “All” that is needed now is detect which normal component (one or both) causes this to happen and correct it/them.
This won’t work for most animations because normals would suddenly flip during camera movement.
It also won’t work if there are distinct areas in the normals that are supposed to cause indent which suddenly cause outdent. So would work for non ramped noise and other even random phenomena, but not voronoi or your “typical” normal maps.
Would it be possible on Cycles code level to dictate a robust detection model, and a selector to select how it would treat it? Like “trace ray to world”, “ignore first ray hit”, “ignore self object only”, “trace to selected object”, “smooth/nullify until legal normal” etc? Since normals get pushed into illegal territory also by regular smoothing, it gets kind of annoying also for basic smoothed lowpoly work. I know high glossy roughness can counter/mask some of it, but I often use sharp reflections for speed reasons.
How does other software actually solve this problem?