A normal map is just a map (texture) where the values given are the surface normals at each point, rather than the bump height value. We’re taking out the middleman, so to speak. Instead of having graphics software or hardware calculate surface normals from the bump map, these normals are pre-calculated and stored into the normal map, and then used directly by the processor.
The figure below shows this. It is a cross-section of a normal map, 16 pixels wide. No height is shown because the normal map does not store any height information. It just stores directions to be used as surface normals when lighting calculations are done.
This makes things slightly easier for the graphics processor, though that isn’t usually important. More importantly, normal maps have certain technical advantages over bump maps, which in many instances can lead to better surface detail. In particular:
- Bump or displacement maps require a specification of the world unit dimension indicated by the map intensity. (In other words, the height displacement between the maximum and minimum values of a bump map must be specified in world coordinates such as inches, and this must be done for every bump map.) This may require adjustments when transferring such maps from on program to another. This is not necessary for normal maps, since they do not refer to absolute world distances.
- Because the normal at each pixel in a normal map is completely independent from its neighboring normals, normal maps can produce effects not possible with bump maps, while still being able to do everything that can be done with bump maps.
- On the other hand, bump maps can be created (somewhat) easily by hand using a 2D paint application, which is not case with normal maps. You will find each useful in your creations, depending on requirements.