Tips & Tricks
All images copyright (c)
Page last updated on
February 14th, 2009
People have lately been asking me how I paint textures for Diffuse Maps for 3D models. I currently am using Photoshop and 3DSMax 7. Here's what I do.
One small note: I've scaled down the iamges to fit on the page reasonably, but it makes the text and UV outlines harder to read.
'View Image' to see the full detail, if you need to.
Here's the model I am starting with. It's a Table-tennis-playing troll for a contest over on GameArtisans.net with a poly-count limit of 1500 tris:
When I unwrap the model, I think about which areas can be mirrored and which should be unique. I want the chest and back to not be mirrored because they will have text on them. The face will look a lot more alive the less mirroring happens: It's more acceptable for a minor character but not for a main or hero character. You'll see I only created unique UVs for part of the face, where it counts. No one will ever see both ears at the same time so they can be mirrored.
Here's the checker grid I use for unwrapping, in case you'd like to use it:
Next I bake some lighting and Ambient Occlusion into the map. Bobo the Seal has an excellent tutorial for this on his site.
It's for an even older version of Max than mine so here is my modified version of his steps to work in Max 7 and include Ambient Occlusion baking:
* Make sure renderer is set to Default Scanline
* Put a dull white material on your model
* Turn off all lights and ambient
* Place in a skylight.
-set a reasonable amount of samples - 10 for testing, 20 for render.
* Open the Render>Render to Texture dialogue box.
-Output: set desired path
-Render settings: Choose 3DSMax Scanline.no.advanced#2
-Objects to Bake: Make sure your object is selected.
-Selected Object Settings: enabled
-Set Padding to somewhere from 5 to 10 (this makes the rendered lighting bleed over the UV lines)
-Projction Mapping - skip
-Mapping Coordinates: Object - use Existing channel #1
-Output: 'ADD' to add a Diffuse Map. Set file name and size. Element = Lighting Map, Target = Diffuse color
-Selected Element Unique Settings - enabled
-Baked Material, set to 'Output to Source', render to files only
To render lighting to Diffuse Map, do the same as above, except, don't use a sky light, just use an ordinary Omni. Your shadow settings, such as Shadow Map vs. Ray Traced, are valid. Material settings, like specularity, also affect output, so tweak them to your liking. I found it useful to tesselate and then render for more subtlety. Just make sure that your tesselation doesn't screw up your UVs!
It's important to note that this process should output a file with correct lighting and the texture bleeding over the UV borders by the number of pixels you set in Padding above.
If you save the bitmap image rendered to a window, it will not include the padding and the lighting will be different.
You can save this if you like, but don't overwrite the file that was saved!
If you want to see a more detailed step-by-step of this one part of the process, check out this walkthrough by Draxxuss in posts #24 and 35, as they are really useful.
Anyhow, when you bake these into the maps, here's what they look like:
You'll see that the lighting above goes over the edges of the UVs because we set the Padding value higher.
It smears in a few places where the normals turn sharply, but it's easy to paint over them to fix them up.
I used Texporter to export the UV lines, and in a Photoshop file, give each distinct color a solid fill in its own Layer:
In the PSD, I layer the flat colors, the ambient occlusion map, and the lighting map.
Despite how it looks, I don't flatten the UV lines onto them. They stay in a separate layer to be turned off later.
Even for a non-human character like this, it's really important to remember that skin is never one solid color:
It gets a lot of subtle hues based on how close the blood is to the surface. I add in those color subtleties on a new layer.
I create a new layer above everything else, fill it with RGB [128, 128, 128] grey and set it to Overlay (which makes it invisible.) I start painting in details in black and white.
Keep painting. There's no secret technique here, no magic tech tip that will instnatly make your texture look better. The key to this part is just to paint really well.
Here it is with the Overlay layer done. If you hide all of the layers except for this one, you have a greyscale image alone.
I want to change the shadows and hilights from being just black and white so I want to adjest them to be warm and cool.
To explain how I do that, I need to cover a little background:
When you save a selection in Photoshop, it treats it as an alpha channels, with 100% white being
0% white (a.k.a. black) as 0% selected, and every shade of grey in-between a level of how
100% selected, selected any given pixel is. So what I want to do is take a simple greyscale image
and make just the hilight part of it, and then just the shadow part of it, a selection.
If I just copy the greyscale image into a new channel, I have a selection set where everything will be selected
to some degree, except for the very blackest of areas. So for this I adjust levels and pull the black triangle over
to the center of the histogram (about 128) and then I have a selection set for just the lightest areas.
To make a selection channel for the shadows, I copy the grayscale image into a new channel again and invert it.
Inverting it turns black to white and white to black. So I'm turning the black shadows into white selected areas.
Then I do the same thing with the levels and now I have a selection set for just the shadows!
So back to the texture painting, I use those new channels to add layers to tint
the shadows purple and the hilights yellow, which is a more natural lighting scheme than black and white.
Lastly I create a new layer and paint in any details needed, or make any adjustments I need to for anything else.
Sometimes I do most of my texture detailing work in this stage and only do a brief pass with the overlay.
But in this particular case I did most of my work in the Overlay layer.
Here is the final sheet from the contest so you can see the table too:
Also, special thanks to Dan Rickard (aka Draxxuss) for helping me figure out how to get the the render-to-texture padding working, which saved a whole step in the process.