<p>By &quot;perturb the existing surface normal&quot;, 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.</p>
<p>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.</p>
<p>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.</p>
<blockquote>
<p>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'?</p>
</blockquote>
<p>You as the author of the normal map would have more control in some sense, but do you <em>want</em> 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 <em>useful</em> - you don't want to just throw that away.</p>
<p>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 &quot;identity&quot; 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.</p>
<p>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.</p>

CC BY-SA 4.0
2022-04-02T07:51:20.877Z
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.
joojaa
CC BY-SA 4.0
2022-04-02T08:05:49.597Z
Except for 0 scale offcourse.
joojaa
CC BY-SA 4.0
2022-04-01T22:29:40.890Z
2022-04-08T18:23:01.433Z
2022-04-08T18:23:01.433Z
Nathan Reed
<p>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</p>
<p>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'?</p>
<p>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) ?</p>

CC BY-SA 4.0
2022-04-01T13:18:00.873Z
They overwrite them. It's bump mapping that perturbs normals.
lightxbulb
CC BY-SA 4.0
2022-04-01T13:56:59.037Z
@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
CC BY-SA 4.0
2022-04-01T13:57:35.570Z
@lightxbulb And if normal maps overwrite normals, how can we 'control' the strength of the normal map?
Hash
CC BY-SA 4.0
2022-04-01T14:21:21.360Z
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: http://image.diku.dk/projects/media/morten.mikkelsen.08.pdf
lightxbulb
CC BY-SA 4.0
2022-04-01T14:27:22.403Z
"*If I am to overwrite normals [...], would I not have more 'control'?*" And who is "you" in this scenario? What do "you" want to accomplish with that "control"? This question seems very abstract and generic, with no real idea what it is you're trying to accomplish. A normal is a tool, a means to an end; what end are you trying to achieve?
Nicol Bolas
CC BY-SA 4.0
2022-04-01T15:09:24.803Z
@lightxbulb Sorry, perhaps I should've clarified what I've meant more. I jumped into graphics programming after having spent quite a bit of time with 3d suites like Blender. Blender, for instance, defines a 'strength' parameter for its normal map node, which seems to affect the 'influence' the normal map has on the mesh. That is what I'd meant by 'control' or 'strength'
Hash
CC BY-SA 4.0
2022-04-01T15:19:52.090Z
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.
lightxbulb
CC BY-SA 4.0
2022-04-01T16:27:00.973Z
@lightxbulb Sorry, my bad. I'd assumed the notion of strength was common to all implementations of normal maps
Hash
CC BY-SA 4.0
2022-04-01T17:12:44.833Z
If I had to "strengthen" the visual impact (e.g. roughness) I would make the jumps between normals more pronounced, similar to how a sharpening filter works but for normals. This is easy for bump maps and derivative maps, but not as obvious for normal maps, it could be that sharpening of each channel works, though there are probably better approaches. My best suggestion is to ask someone familiar with blender's development, they probably have a forum or something. I know there's a blender stackexchange but I don't know what kinds of questions go there.
lightxbulb
CC BY-SA 4.0
2022-04-01T18:57:38.703Z
@Hash your talking of bump maps. That do get converted to normalmaps.
joojaa
CC BY-SA 4.0
2022-04-01T20:09:08.087Z
@lightxbulb Jumps between the normals? What do you mean exactly? Do you mean emphasizing the 'angle' between 2 normals close to each other on the mesh's surface?
Hash
CC BY-SA 4.0
2022-04-01T20:29:44.877Z
By make the jumps larger I mean exactly that - the opposite of smoothing. It will ideally increase the angles, making small details more pronounced. After all a detail due to a normal map is meaningful only in the context of its neighbourhood. The larger the difference, the rougher/more pronounced the detail would look like under lighting.
lightxbulb
CC BY-SA 4.0
2022-04-01T20:40:36.257Z
@lightxbulb wouldnt a tangentmaps stength we simply be a basis change where the tangents turn towards the normal.
joojaa
CC BY-SA 4.0
2022-04-01T20:47:29.883Z
@Hash could you post a link to a image of a blender shader graph that you are thinking of. We have good reason that you think of bumpmaps (bumpmaps are after all converted to tangent info so they are going into a normal slot in most shaders)
joojaa
CC BY-SA 4.0
2022-04-01T21:00:48.293Z
@joojaa Here is an image of a graph depicting what I meant: https://imgur.com/a/np5hw97

The normal map node possesses a parameter for controlling the strength, and according to the Blender docs 'takes in an RGB normal map image' as an input (though I am using a single RGB color here instead). Said strength option can also be used with world and object space which can be set as a setting (which in the case of my image is set as a tangent space map)
Hash
CC BY-SA 4.0
2022-04-01T21:03:50.273Z
@Hash i dont see how that would preturb anything.
joojaa
CC BY-SA 4.0
2022-04-01T21:05:19.527Z
@joojaa Sorry, I'd misread, I'd thought you'd asked me to send an image showing the strength setting in the blender shader graph. What I do have takes in a normal map as an input however, and I am not sure if as to whether or not the strength setting is linked to the perturbation of the surface normals
Hash
CC BY-SA 4.0
2022-04-01T21:07:30.933Z
No i asked for this. Most likely your question is just invalid. Some sources i have read do call bump mapping and normal mapping interchangeably just normal mapping
joojaa
CC BY-SA 4.0
2022-04-01T21:44:10.753Z
@jooja "wouldnt a tangentmaps stength we simply be a basis change where the tangents turn towards the normal" - I doubt that.
lightxbulb
CC BY-SA 4.0
2022-04-03T07:31:09.807Z
A friendly reminder that comments are not for extended discussion. That said, I'm not mad at anybody. But, just be aware that we have a chatroom!
luser droog
<texture><normal-mapping>
Why do normal maps perturb existing normals as opposed to 'overwriting' them?
Hash
# Why do normal maps perturb existing normals as opposed to 'overwriting' them?

(Asked by: username_0 on 2022-04-01)

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) ?

**Tags:** texture, normal-mapping

> **Comments:**
> **username_1**: They overwrite them. It's bump mapping that perturbs normals.  
> **username_0**: @username_1 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?  
> **username_0**: @username_1 And if normal maps overwrite normals, how can we 'control' the strength of the normal map?  
> **username_1**: 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: http://image.diku.dk/projects/media/morten.mikkelsen.08.pdf  
> **username_2**: "*If I am to overwrite normals [...], would I not have more 'control'?*" And who is "you" in this scenario? What do "you" want to accomplish with that "control"? This question seems very abstract and generic, with no real idea what it is you're trying to accomplish. A normal is a tool, a means to an end; what end are you trying to achieve?  
> **username_0**: @username_1 Sorry, perhaps I should've clarified what I've meant more. I jumped into graphics programming after having spent quite a bit of time with 3d suites like Blender. Blender, for instance, defines a 'strength' parameter for its normal map node, which seems to affect the 'influence' the normal map has on the mesh. That is what I'd meant by 'control' or 'strength'  
> **username_1**: 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.  
> **username_0**: @username_1 Sorry, my bad. I'd assumed the notion of strength was common to all implementations of normal maps  
> **username_1**: If I had to "strengthen" the visual impact (e.g. roughness) I would make the jumps between normals more pronounced, similar to how a sharpening filter works but for normals. This is easy for bump maps and derivative maps, but not as obvious for normal maps, it could be that sharpening of each channel works, though there are probably better approaches. My best suggestion is to ask someone familiar with blender's development, they probably have a forum or something. I know there's a blender stackexchange but I don't know what kinds of questions go there.  
> **username_3**: @username_0 your talking of bump maps. That do get converted to normalmaps.  
> **username_0**: @username_1 Jumps between the normals? What do you mean exactly? Do you mean emphasizing the 'angle' between 2 normals close to each other on the mesh's surface?  
> **username_1**: By make the jumps larger I mean exactly that - the opposite of smoothing. It will ideally increase the angles, making small details more pronounced. After all a detail due to a normal map is meaningful only in the context of its neighbourhood. The larger the difference, the rougher/more pronounced the detail would look like under lighting.  
> **username_3**: @username_1 wouldnt a tangentmaps stength we simply be a basis change where the tangents turn towards the normal.  
> **username_3**: @username_0 could you post a link to a image of a blender shader graph that you are thinking of. We have good reason that you think of bumpmaps (bumpmaps are after all converted to tangent info so they are going into a normal slot in most shaders)  
> **username_0**: @username_3 Here is an image of a graph depicting what I meant: https://imgur.com/a/np5hw97  The normal map node possesses a parameter for controlling the strength, and according to the Blender docs 'takes in an RGB normal map image' as an input (though I am using a single RGB color here instead). Said strength option can also be used with world and object space which can be set as a setting (which in the case of my image is set as a tangent space map)  
> **username_3**: @username_0 i dont see how that would preturb anything.  
> **username_0**: @username_3 Sorry, I'd misread, I'd thought you'd asked me to send an image showing the strength setting in the blender shader graph. What I do have takes in a normal map as an input however, and I am not sure if as to whether or not the strength setting is linked to the perturbation of the surface normals  
> **username_3**: No i asked for this. Most likely your question is just invalid. Some sources i have read do call bump mapping and normal mapping interchangeably just normal mapping  
> **username_1**: @jooja "wouldnt a tangentmaps stength we simply be a basis change where the tangents turn towards the normal" - I doubt that.  
> **username_4**: A friendly reminder that comments are not for extended discussion. That said, I'm not mad at anybody. But, just be aware that we have a chatroom!  

---

## 1 answers

### Answer by username_5 on 2022-04-01. Score: 3 | Accepted answer

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.

> **Comments:**
> **username_3**: 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.  
> **username_3**: Except for 0 scale offcourse.  

---

