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.
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.
Let’s take a look at our scene first. I have a low poly cloth mesh as you can see in the following screenshot.
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.
Starting with the regular texture setup
Let’s see how my mesh looks so far.
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.
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!
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.
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.
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.
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.
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.
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.
Bringing in a “vector math node” and setting it to normalize
And now we can use these two normal maps at the same time.
Final Setup (Reference)
Final Setup (Reference) — Larger View
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!