Imagine you are a tattoo artist, and a lovely magician’s assistant has asked you to do a very intricate tattoo all over her body. The problem is that the magician had cut up his lovely assistant into several pieces, but before he could put her back together, a time-traveling doctor pulled him away to help save the known universe. Despite the state of her body, the magician’s assistant is alive and well, thanks to the power of magic. Her boss will be back soon, but in the meantime, his lovely assistant insists that you tattoo her while he is away, or she’ll be too busy practicing and performing stage magic to ever have another opportunity like this.
As implausible as this scenario may be, I’m faced with basically the same underlying problem in trying to texture my snake model. To accommodate the entire snake in a 1024 × 1024 texture map, I had to lay out the snake as if it had been sliced into pieces. If I were to map the surface of the snake as shown below, I’d be wasting space on the texture map.
By cutting up the snake on the texture map, I can make greater use of available pixels.
Now the challenge with this kind of layout is to align the textures on each part of the snake perfectly with each other. It would be like trying to tattoo a lady who had been sawn to pieces. Actually, it would be more difficult than that. As can be seen in the UV map above, the head looks like it has grown much too big for the neck, which in turn, is much too big for the rest of the body. I did the UV map like this so that the head and neck can receive proportionately more texture detail than the rest of the snake. Good luck trying to align all the textures manually. If I had an entire snake model with scales, I could simply bake the normal map and let the software take care of aligning the textures perfectly. Making a snake model complete with 3D scales would require more time and effort than I’m willing to spend, however, so that approach is out of the question.
The solution that I eventually settled on was to first abandon my previous efforts at sculpting in ZBrush, which I blogged about last time. Upon taking a closer look at my reference pictures, I realized that I did not sculpt the scales correctly. Besides, my model was ugly. In the close-up picture below, it is obvious that the edges of the scales are not crisp. I can’t seem to emboss scales with crisp edges in ZBrush. I was hoping that these imperfections would magically disappear in the normal map, but that was not the case. As they say, garbage in, garbage out, and my high-poly mesh was garbage.
My next step was to build some snake scales in 3DS Max. Below is one of the scales that I made. It comprises over 400 polygons, far more than would be practicable to cover a snake with. Nevertheless, I liked its smooth surface and extra crispy edges so much that I couldn’t bear to simplify it. The scale turned out to be far thicker than it should have been, but that didn’t cause me any problem.
With these scales, I covered strategic areas of my low poly snake. Although it is nowhere near as difficult as covering the whole snake with scales, it is still mind-numbing work. Each scale had to be resized, moved into position, and rotated so as to overlap the scale behind it. I made sure to completely cover the areas that had UV seams. This solves the problem of how to align the textures across different UV segments. Below is how the snake looks with the scales that I placed on it. Kind of makes me think of a luchador in a bikini, which isn’t a thought I’d like to hold for very long.
I then baked my normal map and edited it with Photoshop to cover the parts of the skin with no scales. I’m not finished with the normal map yet, but I’ve done enough to prove that this approach to texturing the snake will work. Below are two scanline renders of the snake. The first picture shows the snake with a freshly baked normal map, and the second picture shows how it looks after I had added more scales with Photoshop.
Looks like I’m finally on the right track. It won’t be long before we’ll be seeing how this baby looks in NWN2.