# Why do normal maps perturb existing normals as opposed to 'overwriting' them?

To preface, I am a bit of a beginner to graphics programming. From what I've read, normal maps merely perturb the existing surface normal as opposed to overwriting them as I'd previously thought

But why is this so? Would this not put our normal map at the 'mercy' of the normals of our mesh? If I am to overwrite normals (that is, replacing the normal on the surface with the corresponding one from the normal map), would I not have more 'control'?

Is this because perturbing as opposed to overwriting allows us control how 'strong' the normal map is, for which we need the existing surface normals as 'reference' (assuming we use tangent maps that is) ?

• They overwrite them. It's bump mapping that perturbs normals. Apr 1, 2022 at 13:18
• @lightxbulb I see. I am curious though. Why exactly do bump maps perturb normals? From what I understand, a bump map can be 'converted' to a normal map via finding the partial derivative on the x and y axis. At that point, is it not technically a normal map? Why not just overwrite the normals at that point? Why perturb?
– Hash
Apr 1, 2022 at 13:56
• @lightxbulb And if normal maps overwrite normals, how can we 'control' the strength of the normal map?
– Hash
Apr 1, 2022 at 13:57
• Define "strength" for a normal map. Normals are unit length. As far as bump maps go, they contain less information than normal maps, notably it's only a single channel roughly representing a heightmap. Whether you interpret it as overwriting or perturbing is really a philosophical question, since you actually do reconstruct a normal $(-\partial_u h, -\partial_v h, 1)$ from a bump map. The difference to a normal map is that the normal map gives you the normal $(n_x, n_y, n_z)$ directly, and not through a heightmap $h$. See: image.diku.dk/projects/media/morten.mikkelsen.08.pdf Apr 1, 2022 at 14:21
• I do not know the internal workings of blender. You would probably have to find a description of what they do in order to understand how this is implemented. Apr 1, 2022 at 15:19

By "perturb the existing surface normal", I think what you mean is that we use normal maps defined in tangent space, so that when the normal map is applied it acts as a displacement (loosely speaking) to the underlying geometric normal of that surface.

One reason to do this is simply that a tiling texture can be designed, where the texture can be applied to surfaces of any orientation. For example, a single brick texture could be used on walls, a floor, or a ceiling. All those surfaces have different geometric normals, but we can re-use the same normal map for all of them by using their tangent space as a basis for applying the normal map.

A similar issue affects animated characters, where for instance you want to move the character's arms and legs around using an animation at runtime. Tangent-space normal maps enable the fine texture detail to follow along with any motion, without needing to alter the contents of the texture.

If I am to overwrite normals (that is, replacing the normal on the surface with the corresponding one from the normal map), would I not have more 'control'?

You as the author of the normal map would have more control in some sense, but do you want that control? It's usually more useful to create normal maps that can adjust to the shape of the mesh they're applied to. Otherwise, every time you change the shape of a mesh, you would need to update the normal map to match. And if you got it wrong, the lighting on the model would just look completely messed up. The information provided by the underlying surface geometric normals is useful - you don't want to just throw that away.

It's true that normal map strength can also be readily adjusted in tangent space, by lerping the normal map toward or away from (0, 0, 1), which is the default or "identity" normal in tangent space. This is more of a side benefit to the tangent space technique than its primary purpose. Other texture transformations, such as rotating or blending between different texture layers, can also be done readily in tangent space.

Another side benefit is that tangent space normal maps are easier to compress without losing too much quality, since they have effectively fewer degrees of freedom and a narrower typical range of values.

• Yeah lerping inwards or outwards is easy. I think if i remember correctly one can transform normals with the inverse of the transpose of the transformation you want to impose on the underlying object. Then renormalize. Or atleast something like that. (I remember reading that in Tony Apodacas sigraph paper Lore of TD's) There were a few corner cases that didnt work so the advice was never to do this for geometry. But i think that for normalmaps that makes sense since its essentially only scale anyway which isnt problematic. Apr 2, 2022 at 7:51
• Except for 0 scale offcourse. Apr 2, 2022 at 8:05