Unity sprites with Normal Maps from Houdini Cops
At the beginning of the year I had the pleasure of working on a VR game called Lichtung. It’s a 2D/3D VR project with hand-animated sprites. Since we had about 2 months of active development hand painting normals was not an option, which meant we needed a reliable way to generate normal maps from 2d animations images so the art could react to 3d lighting.
Houdini’s COPs (with a bit of TOPs for automation) turned out to be perfect for this workflow. I’ll also walk through how to set up the Unity shaders, since working shader graph tutorials are hard to find — it feels like it changes every two months.
All this information nothing new, but scattered across different forums and docs, so hopefully this article pulls it together into something more straightforward.
Houdini Cops for Normal map generation.
-
Load textures into cops
-
Tweak the texture into black-and-white so the important details stand out (SDF relies on clear values).
-
Take the texture → mono → SDF, giving the flat image some depth information.
-
Shape the heightmap – Convert SDF back to mono with a smooth falloff, adjust distances, and blur for clean gradients.
-
Use Height to Normal to create a tangent-space normal map ready for Unity.
(I also added distorted the normal map with some noise to give it a handpainted feel)
The nice thing is, once you set it up for one frame you can render out the whole sequence and the whole process can be easily automated with TOPs!
Importing to unity
For our project, we were working with spritesheets, which I recommend using. You will also need to generate a corresponding normal map spritesheet (this can be done directly in TOPs). Once created, these normal maps should be imported just like the texture sprite sheet.
Now open the Sprite Editor of your Sprite and add them as a, using the specific naming convention _NormalMap
in the Sprite Editor.
By referencing this name in the Shader Graph, Unity will automatically recognize it, pulling the correct image set from the Sprite Editor.
These are the Graph setting that worked for me
That is basically all, once applied to a sprite the normalmaps get loaded per frame and react to URP 3d Lights.