Banding/Stepping of textures, please help

I’m trying to do some normal maps out of an image map parameter. I was able to make it with these nodes called PreparePerturbNormalHQ and PerturbNormalHQ. Who knows what they are doing, I just know that it works BUT I don’t know why the hell I’m getting this horrible “banding” or “stepping” on the results. This is a 2k image, and it still looks wrong.

Is this something that happens with these two nodes? Or is this something from the image settings? I’m including both.

It’s not the first time I get this horrible banding/stepping look, so it would be really good to know how to avoid this.


Retrieving normals like that is by no means a substitute for proper normal map, so this is expected. You might achieve a bit better results using normal from heightmap material function.

Hi @Deathrey Thank you for answering. Heightmap does marginally better results. I’m attaching those results in this reply

I didn’t use it because my intention is to create normal maps programmatically. The best solution is to feed the normal channel a normal map.

I’m aware that the dynamic creation of masks and normals is something that Substance painter does very well. I am investigating similar workflow capacities within Unreal Engine for very particular production needs.


Bake the normal map and use it in your material.
It’s the fastest and best looking.

@Raildex_ Thank you for answering. Yes indeed, baking it would be the fastest. I did mention briefly above that I’m looking into procedural normal map generation within unreal engine. I agree with you that having a normal map would be the best way to achieve fast and exact results. Yet that is not the goal that I’m trying to attain here. I’m testing Unreal Engine capacity to create normals on its own within the material editor. And the only barrier I’m encountering right now is the banding and stepping happening with the use of black/white maps. I would really like to know why is it happening, and if this the furthest this tool can be used for. I might just be missing knowledge of using these or more tools properly.

I guess I can ask EPIC directly, but thought of giving it a try here on the forums.


The banding is probably from the DXT5 compression.

It is caused by 3 factors. First being limited precision of the heightmap(you only have 256 unique values). Second is compression, as mentioned by ZacD. And last but most important is the size of normal generation kernel, which is just 1 texel wide, and misses most of the frequencies in your heightmap. Offline normal map generation kernel is commonly larger.

Thank you @Deathrey ! That explanation was awesome.