# 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. – Carlo 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. – Yvain 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. – Igor Tatarnikov 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 – dimus 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 – John McDon 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 – Igor Tatarnikov 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? – Carlo 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 :) – Yvain 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.

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. – HellrazorX May 2 '18 at 2:21

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

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. – Alphisto 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. – Bithur Dec 11 '16 at 15:09

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? – Lukasz-40sth 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