How to combine two different normal maps in Blender?

In today’s tutorial, I’ll be diving into something that should be very easy to do in Blender, but unfortunately not: Combining two normal maps.

Note: If you are tired of watching video tutorials and would like to see more text-based tutorials like this one from me, you can support me on Patreon so I can dedicate more time to creating them.

1. But Why Would We Need To Merge Normal Maps?

One of the methods that requires this type of workflow the most looks something like this:

You have a high poly model. And you want to have these details of high poly model on the low poly mesh. So what’s the solution? Easy! Normal baking. So far so good. But what if you want to add even more details to your low poly mesh by using another normal map? Maybe you’ve already tried using the MixRGB node but it doesn’t really work, does it?

Well, in this tutorial, I’ll show you guys how we can combine two separate normal maps and use them simultaneously in Blender.

2. How do we use two normal maps in Blender then?

Let’s take a look at our scene first. I have a low poly cloth mesh as you can see in the following screenshot.

Lazy Loaded Image

Low Poly Cloth Mesh (Material Preview)

To make the tutorial easily followable, I’ll start with the usual texture setup. I’ll import my albedo, roughness and baked normal map textures into Blender and connect their pins into the appropriate inputs of the Principled BSDF.

Lazy Loaded Image

Starting with the regular texture setup

Let’s see how my mesh looks so far.

Lazy Loaded Image

Current Mesh Appearance (Material Preview)

I’ll continue with the basic setup and bring in a displacement map and use it as bump to give more details to my mesh.

Lazy Loaded Image

Bringing in a displacement map

So far so good. Since now our regular setup is complete, we can jump into the part you’ve been waiting for!

3. The Fun Part Begins!

Lazy Loaded Image

Your advertisement can be placed here for $200 permanently. Suggested resolutions: 1800x663 or 1400x1400. Contact us.

The first step is importing the other normal map that we want to get those sweet extra details from. After that, we’ll throw in two “Separate XYZ node” into the mixture.

Optional Read: What “Separate XYZ” node does is, taking the values of a vector and splitting these values into their individual components in XYZ (X-Axis represents width, Y-Axis represents depth and Z-Axis represents height) format. We need this node because we want to take Y-Axis and X-Axis values of these two different normal map and merge them together so they can be read as one by Blender.

Lazy Loaded Image

Bringing in two “Separate XYZ node” node into the mixture

Now we have access to the X, Y and Z axis informations of these individual textures and all we need to do is to combine the axis values that lie in the same direction. To do this, we’ll introduce the “Math” node to the blend and set it to “Add” since we want to add these values into each other.

Lazy Loaded Image

Math Node Green: Adds X values into each other — Math Node Orange: Does The Same Thing For Y Axis Values

X-Axis values of both of the normal maps go to the X calculator math node and Y values are going to the Y calculator.

Lazy Loaded Image

X & Y Pins Connection Reference

We were able to separate the values we needed, added them into each other so the next step would be accessing these new combined values. Now all we need to do is with the help of “Combine XYZ Node”, recombining them.

As one may expect, X calculator’s pin should be attached to X channel of the “Combine XYZ node”, and the Y calculator’s pin is going to be attached to the Y channel.

Lazy Loaded Image

Re-Combining In Action (You can right click on this image and open it on another tab for a larger view.)

The last step we’ll take here is taking the Z value of our baked normal texture and connecting it to the “Combine XYZ node’s” Z channel.

Lazy Loaded Image

Final Setup

Okay, we are almost there. The last step is bringing in a “vector math node” and setting it to normalize. That’s it!

Optional Read: We’re normalizing the results we are getting from the “Combine XYZ node” to make our vector to have a length of one while keeping the ratio of X, Y and Z the same. If this subject sounds interesting to you, I’d suggest checking this post on blenderartists.org for a more detailed explanation.

Lazy Loaded Image

Bringing in a “vector math node” and setting it to normalize

And now we can use these two normal maps at the same time.

Lazy Loaded Image

Final Setup (Reference)

Lazy Loaded Image

Final Setup (Reference) — Larger View

4. How To Combine and Export Two Normal Maps in Blender So We Can Use It In Game Engines such as Unity & Unreal

This one is actually a lot more difficult than what we just achieved because Blender does not offer an easy-to-use tool for such action but a user with the nickname of radcapricorn on BlendSwamp shared a project file that makes this process very very easy and quick and it’s free. I’d suggest checking his/her post here (Post Title: Combine Normal Maps) if this is what you are trying to achieve. Such action can be done within Blender manually as well by setting up bunch of nodes but since they’ve already implemented it and it’s completely ready to use, I think it’s better to end the tutorial here.

Let me know if I missed any important part in this tutorial or if there is anything confusing there. Until then, happy blending everyone!

Edit from the future: It's actually quite easy to combine these two normal maps in Photoshop or, even better to have more control over it: assign the UV islands to different channels in Blender. For example, in Unreal Engine, when reading the baked normal data, we can specify a particular UV channel, while the generic normal map can refer to another UV channel. Depending on the volume of requests, I might write a tutorial on how to do that as well. Just let me know!