Another update. With UVs in place it's time to bake the normal maps.
Blender can actually bake some decent normal maps between high-resolution and lower-resolution meshes, but I prefer to have the flexibility of using an additional third mesh called a "cage" which - in short - helps direct any ray casting done during the baking to ensure more accurate results. (This article helps explain this.) I therefore used xNormal to bake all my meshes.
In Blender I exported three versions of each component as an OBJ:
- The original high-resolution mesh which was re-topologized over the sculpt
- Each lower-poly equivalent per my posts above
- A version of each lower-poly mesh with a slight "Displace" modifier for use as a Cage
The displace modifier is really helpful. I sometimes use it a little to ensure my lower-poly meshes slightly cover the high-poly mesh. And then as mentioned above use it again to fatten further to make the cage, ensuring it has the same topology as the lower poly mesh in the process (necessary for a cage).
I also used a Triangulate modifier to (non-destructively) convert my lower poly meshes and cages to tris before exporting to OBJ.
One nice thing about xNormal is that you can queue up all your meshes and then leave them to bake, but I spent the time to work slowly one bake at a time so I could double-check and make adjustments as necessary. Another cool thing with xNormal is that it has a 3D viewer so as soon as you've baked a map you can quickly double check the results when applied to your lower poly mesh.
A couple of times during the process I went back into the texture atlas, adjusted a couple of UV vertices or recut them slightly to get a better bake. Baking normal maps is a bit of a black art, but it's worth spending the time to get the best bakes possible because any issues that come up in normal mapping will likely re-appear in texturing, so if you can't get a decent bake now, no amount of trying to fix things later will really help.
After about a day's methodical work I had a set of 20 or so normal maps, one for each component. I then used Vincent Callebaut's indispensable Photoshop plugin to consolidate all the normal maps into one texture atlas. You would think that you just need to layer each normal map in Photoshop with an "overlay" or something, but it's actually not quite that simple, and that's where the plugin really helps.
Here's the resulting map:
And here I am testing it back in Blender on my low-poly mesh:
And, of course, how it looks on Sketchfab:
Next up I'll move onto baking Ambient Occlusion (AO) to help visually reenforce all the little details which will be the first stage of the texturing process