I’ve written a few things about this subject over the years and you will find quite a lot of information around the internet on lighting sprites with normal maps and doing things like making 3D models from depth / height maps. I wanted to add a few things I’ve been playing with to the mix.
I recently revisited the normal map from 2D image technique with an experiment for a goldfish Illustration I’m working on and tried out a program called SpriteIlluminator as well. Incidentally I was really happy with the results, it is a great program for making normal maps for this very purpose as well as its intended use in 2D games with dynamic lighting of course.
Sub Surface Scattering
Because I’ve been trying out fake sub surface scattering effects in 3D Coat for some of my recent 3D models, I wondered if a similar trick could be done for 2D graphics by using depth maps as well. For some context here is the “trick” on one of my 3D models- a frog.
The effect needs 2 light map types to be baked: a translucency map and a thickness map. They look like this in 3D Coat:
To get them to look like a sub surface scattering effect (SSS) the order they appear in the layer stack and the layer modes have to be adjusted.
The layer mode for the thickness map is set to highlight emission and this map goes below the normal map but above the translucent map. The translucent map is set to add mode. Opacity of this layer can be adjusted depending on the strength of the effect desired.
Although there is no highlight emission layer mode in most 2D software, I was curious if a similar effect could be faked using depth maps to create the “translucent” and “thickness” effect.
2D Light effects
After some experimentation with depth maps, layer modes and gradient maps in Affinity Designer I created some nice effects that looked a bit like sub surface scattering.
I tried a program called Laigter and one called SpriteIlluminator to generate the normal maps needed for this experiment. laigter generates a normal map automatically, the settings can be tweaked to get different looks for your sprites. Nice and fast for simple sprites.
SpriteIlluminator can be used in a more custom way to make the normal map look exactly as you want it with editing tools and brushes. Although there are some extra plugins you can download for Laigter to help get a more custom look for your normal maps, I found SpriteIlluminator easier and nicer to use for that purpose, it also had an undo feature and selection tools which helped me.
I could build up the depth of different parts of the goldfish using selection poly lines and the bevel tool. After that I selected where I wanted some scale details and used the emboss tool. It also has a soften brush which was useful for blending where the edges of the selection lines were.
Anyway here are the resulting normal maps:
I also used Awesome Bump to generate depth maps from the resulting normal maps.
To create the effect in Affinity Photo (or any 2D image editing program with similar features), the depth map is inverted and masked. This is then duplicated so that there are 2 layers for a Linear Light layer mode and a Soft Light layer mode. The opacity of the Linear Light layer and the Soft Light layer can be adjusted to get the strength of the effect you want. I set them both to 46%.
A gradient map adjustment layer is then added to both layers, the gradient map for the Linear Light layer is set to Linear Burn layer mode. The gradient map for the Soft Light layer is set to Luminosity layer mode.
You can choose any colour you want for the gradients, for this example I went with a scale from bright orange to white.
Here are the results I made with Laigter and SpriteIlluminator:
After that I decided to try a Phong Bump map adjustment filter layer with the normal maps using overlay layer mode in Krita. Gives it a bit more of a 3D look.
Here are the results of that:
I was able to get a more 3D looking effect using the normal map and depth map I created using SpriteIlluminator. The thing I liked about SpriteIlluminator are the editing tools for creating more custom normal maps. Although Laigter is brilliant for fast results and is free, I needed something with more control for this effect to work better without having to make a 3D model.
See this video I made for the above process:
3D from 2D tests
I did try another approach using Curvy3D to make a 3D model from a depth map and then further sculpting in ZBrush to create a more 3D looking depth map (in the render passes), but it was really awkward matching the output depth map render to the original Illustration size and it was time consuming and difficult. Bas relief sculpting is another topic worthy of a separate article in its own right, but it is really hard and time consuming. The results were not as good as the depth map I created using SpriteIlluminator from the 2D image either.
Curvy 3D‘s inflate image tool is still a great way to make depth maps into 3D models though. Although this is a little extra feature hidden in the program it is really good.
I also found a free online tool to create 3D meshes from depth maps if you don’t have Curvy3D called IMAGEtoSTL. The results are not as nice as the Curvy 3D method, but it gets the job done.
I also played a bit with the new Bas Relief Project feature in ZBrush.
Thanks for reading this article, if you found it interesting please share it on your social medias or tell a friend.
In my travels for this experiment I looked at a few things concerning CNC because height-maps are an established way to create suitable Bas Relief results for wood carving machines.
Software for CNC