Normal mapping is a bread and butter process these days for anyone working in 3D graphics. Despite the impressive ability of modern hardware rendering models with all those little nooks and crannies chipped into them is still largely an impossibility in real-time.

Normal maps stand as a ‘I can’t believe it’s not high-poly’ solution. Represented by an RGB colour scheme, a normal map offers a pixel-detailed representation of height data that can be used by a rendering engine to create fake lighting information across the surface of a model. A normal itself refers to the direction the engine is calculating surfaces we see generated between geometric points on the model. What the normal map does is add or subtract from the perceived position of the normals within the environment, determined by the blues, reds and greens representation on the map, so that the engine will treat sections of that surface as being extruded when it comes time to calculate how it’s lit.

There are two varieties of normal map being used in modern practice. The first and more common of the two is a ‘tangent space’ normal map. Tangent space normals are drawing their data for the direction the normal surface they’re applied to directly from the mesh. This is part of the reason it’s important to preserve ‘tangent and binormal’ information when exporting an FBX or similar file format. Visually these maps appear more blue than their counterparts, as that value is now essentially only representing the neutral flat surface of the normal on the object. An object space map will give a similar result, and in truth is more able to accurately convey complex normal deformations, but because it’s not drawing upon the mesh data will have trouble deforming accurately, at least not without a goodly amount of extra time spent setting up the mesh it’s applied to for each specific situation in scene.

The overall aim with a normal map in a real-time pipeline is generally to take all the wonderful detail that can be achieved with programs such as mudbox, zbrush and mari and bring it to life on a lower poly mesh, such as that you’d find in a video game. The general pipeline for this process would see you then take your high-poly model from these programs, and either use the retopology methods they offer, or those available through other tools like 3DSMax, Maya, 3DCoat etc. to create a mesh that matches the rough shape of the original model(s), but is topographically mapped to be efficient for real-time engines. From here once the lower-poly object is unwrapped, the tools listed above, in addition to the very effective and entirely free XNormal can be used to generate normal maps and other height-based data maps that serve similar uses in preserving detail.From a games design standpoint, they are also extremely memory efficient in file size.

For my own workflow I have the benefit that both 3DS Max and XNormal natively translate normal data in the same fashion as the latter programs I use, such as Quixel and Unreal 4, so I rarely have to do little more than flip a Y-value on occasion. Doing this bit of research has been beneficial all the same, as I now have a more solid idea of what exactly is going on in the background when I plug in my normal maps, and how to identify errors on a visual basis when they come up in shading.

medun_normal
Fairly complex set of normals for my character Metum. Those on the right represent the fairly extreme work being done around low poly sections of the character retopologised from a zbrush mesh, whereas those on the left (and also over the zbrush areas) show more subtle surface detail added later in Quixel.

References

Chadwick, E. (2016). object space normal. Retrieved from http://wiki.polycount.com/w/images/8/8a/Normalmap_worldspace.jpg

Chadwick, E. (2016). tangent space normal. Retrieved from http://wiki.polycount.com/w/images/8/8d/Normalmap_tangentspace.jpg

Hajioannou, Y. (2013). Gamedev Glossary: What Is a “Normal Map”?. Game Development Envato Tuts+. Retrieved 10 May 2016, from http://gamedevelopment.tutsplus.com/articles/gamedev-glossary-what-is-a-normal-map–gamedev-3893

Normal map – polycount. (2016). Wiki.polycount.com. Retrieved 10 May 2016, from http://wiki.polycount.com/wiki/Normal_map#3D_Workflow

Normal Map Technical Details – polycount. (2016). Wiki.polycount.com. Retrieved 13 May 2016, from http://wiki.polycount.com/wiki/Normal_Map_Technical_Details#Tangent-Space_vs._Object-Space

Russell, E. (2014). Know the Difference: Bump, Normal and Displacement Maps. Digital-Tutors Blog. Retrieved 10 May 2016, from http://blog.digitaltutors.com/bump-normal-and-displacement-maps/

Technologies, U. (2016). Unity – Manual: Normal map (Bump mapping). Docs.unity3d.com. Retrieved 10 May 2016, from http://docs.unity3d.com/Manual/StandardShaderMaterialParameterNormalMap.html

Advertisements