# How to Combine two Normal Maps?

I made a high poly model and then baked its textures onto a low poly model.
Now I want to give another normal map's details to the model. How can this be done?

• I find this article about the argument quite interesting: blog.selfshadow.com/publications/blending-in-detail. I didn't tried (yet), but at first look, seems to me that similar results can be achievable with nodes. Sep 9 '15 at 20:24
• If you are using Internal renderer, adding a new texture and setting its influence to normal will do it. With Cycles you can go for the Displace effect. I don't know about the way to mix a proper normal map with the BW factor of a texture though. Sep 10 '15 at 0:09
• The thing is that I want also to be able to somehow export the texture of both normal maps combined, because I will be importing the model into Unity Game Engine, and all the node data just disapears as Unity isn't able to read/receive external nodes(not sure). Also there is only one slot for a Normal Map.
– A.D.
Sep 10 '15 at 11:51
• I made an OSL shader script for this purpose (see the "bonus" script at the end): blender.stackexchange.com/a/51624/131 May 15 '16 at 16:08
• I made a node group that contains all your mentioned methods, you can switch or blend between them. I also gave credit to you guys, thanks! dropbox.com/s/yuw85rsfeeoqla6/Combine_Normal_Maps.blend?dl=0 Apr 29 '18 at 12:54

The simple formula is:
"Normal map 1" (nm1) the large distortion, "Normal map 2" (nm2) the small details.
nm1.x + nm2.x = X, nm1.y + nm2.y = Y, nm1.z = Z

1. Split the normal maps in the their three separate channels with a Separate XYZ node.
2. Add the X channel of both normal maps together with a Math node set to Add
3. Add the Y channel of both normal maps together with a Math node set to Add
4. Make the new vector with a Combine XYZ node. Plug the component X into the X input of the Combine XYZ node, and the component Y into the Y. Take the Z from the first normal map.
5. Add a Vector Math node set to Normalize. Take the output from the Combine XYZ node and plug it into the first slot of the Normalize node.
6. Add a Normal Map node. Take the output from the Normalize node and plug it into the color slot of the Normal Map node.

Another option is to use Multiply instead of Add for combining the X and Y channels. The bonus with this is, I have found no need for the Normalize node. The resulting normal map will look different from the method above.

• That is good !, but is there a way to save this texture so I can give it to my model in a game engine like unity
– A.D.
Sep 11 '15 at 13:50
• I tried your node setup, but that lead me to a non-symmetrical shading (i.imgur.com/y9rUZ7L.jpg) that in my opinion is not correct. Did I make any mistake? Sep 11 '15 at 14:02
• What I would do is use both normal map with each 0.5 weight (in blender material) then bake the normals -> both will be combined :) Dec 2 '16 at 16:50

I tried both methods presented here (by David and Hellfireboy), but neither of them seemed to work correctly (at least for image textures).

I kept searching online and eventually found this nodesetup.

It's very complicated, and I honestly don't understand it, but it works superbly. Thought I'd post it here for anyone else looking.

• Hmmm any more thought on your method now? Sep 21 '17 at 14:54
• that nodesetup comes from this thread: blenderartists.org/forum/… Feb 14 '18 at 14:47
• Please attach node tree. External links are not allowed for core informations as they are not permanent. Thank you keeping site useful. Nov 7 '20 at 7:34

just adding my 2 cents (not sure why nobody mentions this technique), I do know there are supposed to be some technical drawbacks to this, but I've used it extensively without any issues...

Node Setup:

Render:

NormalMaps

• I can't find what is wrong with this method. Thanks I guess this whole discussion points out the lack of a ''Mix vector'' node in blender anyway. May 2 '18 at 2:21

A method close to what Rico Cilliers proposes is to mix the 2 normal images into a MixRGB in Mix mode, with the factor value at 0.5, and push the Normal Map strength up to 2:

• Wow, so simple. Thank you for the nodes. Jan 26 at 11:32
• well, some will say that it's not rigorous but I tried a most sophisticated method and didn't see any difference :) Jan 26 at 12:49
• Took 6 years but we did it boys! 😂
– A.D.
May 1 at 17:36
• so did you test this solution? May 1 at 17:39
• It’s been years since I switched to MAX. Lol
– A.D.
May 2 at 18:54

Here's the method I came up with: Multiply the normal maps and then divide the output by the (non-color) color of a flat normal.

I use 0.50196 for Red and Green instead of 0.5 because it's the color of a flat normal for normal maps baked in Blender and the result is more accurate when compared with the normal maps rendered separately.

Normal map 1:

Normal map 2:

Combined:

I tried the method from Blend Swap shared by Andre Price but it produces some kind of banding (I saved the output as PNG so it's not the result of lossy compression):

I made node groups for cycles and the compositor (notice that in the compositor the color space of the images must be sRGB, not Non-Color):

I found that this worked a lot better if you continued to treat the images as RGB rather than XYZ. This means using 'Separate RGB' and 'Color Mix' set to Add.

The reason being that using XYZ the image was coming out too dark (eyes and mouth are one normal map while the outer circle is a second one)

Here is what it looked like with RGB separation

And this is with XYZ separation

Another solution to try and one that I think is quite simple.

Basicaly Add vector's but first subtract "plain" normal from the one that's being added.

• Interesting method, it keeps the details of the first normal map I do have a question though, do you know how I could reduce the mix only in the area of the second normal map? Since this method washes out the second normal bit too much lol Jan 13 at 15:38
• If want to change mix level of to maps overall then you can use "Vector Math" Converter with Scale operation AFTER the Subtract BUT BEFORE Add. You can either punch the strength of the Added in normal or weaken it. You can always change which normal is added in with subtract and which not. Jan 13 at 21:34
• Oh yea, thanks, I didn't realize there was a Vector: Scale Jan 15 at 15:15

In mathematical terms, this is impossible. Let's consider two parametrically defined surfaces f(x, y, z)=0 and g(x,y,z)=0 that we want to linearly blend to surface

$$h(x,y,z) = f(x, y, z) + g(x,y,z) = 0$$

The normal functions to this surfaces are

$$f_n = normalize(grad(f))$$

$$g_n = normalize(grad(g))$$

$$h_n = normalize(grad(f+g)$$

where

$$grad(f) = (df/dx, df/dy, df/dz);$$

$$normalize(A) = A/length(A) = A / sqrt({Ax}^2 + {Ay}^2 + {Az}^2)$$

This way you only have normalized gradient maps f_n and g_n called normal maps. You need to find the normalized gradient's sum map h_n. After normalization, you lose information about the length of the vector and there is no way to recover the length. You can try to simply blend the maps and this will give some approximate result, the accuracy of which will greatly depend on the ratio of the lengths of the gradient vectors, but this does not correspond to the mathematical definition of a normal map.

How to solve a problem mathematically correctly?

1. Use bump or displacement maps. The sum of displacements is displacement of sum surface.
2. Try saving a gradient map instead of a normal map. The sum of the gradients will be the gradient of sum surface. You just have to normalize the sum to get the normal map.
3. If you do not have the original displacement map or orininal high poly model, you only have the option of restoring the displacement map from the normal map based on numerical integration.

Using some baked Tangent space normals maps, it looks like the radcapricorn's blendswap node group works well, but the same result with a simple setup can be achieved.

It looks like combining the normal maps images give bad results, it's better to combine the normal map nodes vectors.
Here is my setup :

You can easily change any of the normal maps strength and fix the result modifying the color value of the color Mix/Divide node.

• Just watch out that since you're dealing in world space (Bump node) and not tangent space (Non color data tangent space normal map) you should care for z axis too. Normal map node actually transforms from TS to WS. It just so happens that on a plane with 0 Z size and looking from the top, everything works. But once you get into different geometry that isn't flat like this, problems arise. Dec 11 '16 at 11:28
• @Alphisto Good to know, thanks. If I have time I will change my plane for a cube and bake some TS normal maps. Dec 11 '16 at 15:09

Using the MixRGB to mix two Normal Map nodes seems to be the correct way:

This was you can can control the strength of each normal map and blend them the way you prefer.

I found this answer in the tutorial here. https://blenderartists.org/t/blender-mix-2-normal-maps-together/1245369

In my experiments on this from all the great ideas here, I noted that if you don't normalize the normal you will experience boosted subsurface scattering and not have proper highlights. I tried the differences with the second vector in the normalize node [aka Vector Math (Normalize)] being 1 or 2 or the 0.50196 on the first two values and there was really no difference of course because they are basically normal enough. The default or 0.5 is in my tests sufficient.

So in the end merging both Normals from a "Bump" (procedural texture) and a "Normal Map" (Baked from a High res sculpt to retopologized version), the usage of (two vector math nodes) add followed by normalize was sufficient. In this situation the original "Bump" was with 1/4 strength and 1/5th the distance, while of course the "Normal Map" was baked and set to strength 1.0, so I basically doubled (aka re-adjust to taste with your new setup ~ it seems they mitigate so maybe the smaller detail gets boosted and not the retopo match) the distance and Strength of the pre-merged Normal outputting nodes, to match the original (full high res sculpt and procedural temp texture) result best.

For me it seems like the easiest distillation of the ideas posted so far with some testing effort of rendering a real subsurface scattered head sculpt, (and therefor worth posting ~ I hope its helpful input/feedback).

As a Final note I'm not sure I won't just replace the procedural texture with a hand painted one (skin texture) [so combined] as that makes more sense in the end.

In Blender 2.8 there is a "Mix" node.
It just mixes two colors, then feed it to a normal map node:

• Connecting Normal socket with Color one? Does it work at all? Nov 1 '19 at 11:04
• Yeah it works... im assuming it takes it as a texture like the bottom node that is a normal map texture
– Ruan
Nov 1 '19 at 11:09