How To Create Hand Painted Textures Without Painting
The hand-painted look is a compelling game art style. It adds a whimsically fantastical feel that photorealism lacks. However, actually achieving the look can be quite tedious — sometimes requiring hours for a single texture.
Below is a way I’ve come up with for approximating the hand-painted look that can stand on its own — or if needed — be the basis for a hand-painted texture without having to start from a blank canvas. This process is especially helpful for those pressed for time, say during a game jam.
Finding A Photo Texture
The process starts with a real photo. Somewhere in the photo you choose is a hand-painted texture lurking in the details. Your goal is to remove the right details to reveal the hand-painted texture hidden underneath. When you’re actually painting the texture, you’re trying to build up the details while here, you are trying to tear them down.
I tend to use Pixabay to find my photo textures. Most of the images are free for commercial use and require no attribution which is always nice when developing your own game.
💡 Make sure to find one evenly lit and head on when browsing through the photos.
Cleaning The Photo
There are two clean up phases. This first one will prepare the photo for the filters. In this phase, perform the following in order.
- Crop the photo to have the same aspect ratio that the final texture will have but do not resize the photo just yet.
- If tiling the image, remove any distracting repetition.
- If tiling the image, remove any seams.
For exposing the seams, use the offset tool with wrap selected (in GIMP it is Layer > Transform > Offset…) and divide the width and height by two.
If you can, identify parts of the seams that sort of match and blend these areas individually.
Otherwise, use the clone tool and run over the seams using an origin somewhere further away. Make sure to play around with different brushes as some will work better than others depending on the photo.
Once the seams are gone, I like to throw the image into Krita and use the wrap around mode to judge the repetitiveness of what I have so far.
The result at this point doesn’t have to be amazing but the work you do here will save you time during the second clean up.
Removing The Detail
Open G’MIC and find the
Vector Painting filter. This is what you’ll use to remove most of the detail but preserve the overall structure. I tend to keep the
Details setting above nine but in some cases I’ve had to dip into the mid eights.
For particularly noisy photos, you may have to run it through
Smooth [Anisotropic] first and then
Vector Painting second. Try to keep the
Sharpness high and play with the
Adding The Brush Strokes
It wouldn’t be hand painted without brush strokes. After
Vector Painting, run your photo through the
Brushify filter found in G’MIC.
Brush parameters, use the ellipse shape with a very small
Maximal Size setting can really slow this filter down so keep it between 30 and 40. Make sure to set the
Light Type to
None and set the
Light Strength to zero. Feel free to play around with the
Number of Sizes,
Fuzzyness, and the
Smoothness. Set the
Opacity to one.
Painting parameters, the
Density setting can slow down the filter so start at 50 and work your way up. Set the
Orientation Coherence and the
Gradient Smoothness to one and 10 respectively. Set the
Angle Dispersion to one. Feel free to play around with the
Contour Coherence and the
Structure Smoothness. Most of the time I keep the
Contour Coherence at zero.
💡 The goal here is to see the brush strokes so having it rough around the edges is fine. You want it to look like the colors and shading have all been roughed in but haven’t been smoothed out yet.
Smoothing Out The Brush Strokes
Brushify, run the photo through
Poster Edges. This filter will smooth out the brush strokes and add some definition back in. If you need to, you can remove more detail using the
Image Smoothness and/or the
Posterization Level. Feel free to play with the
Edge Threshold and
Edge Thickness for a more comic book or cartoon style. Keep both of the
Antialiasing settings at 100 and keep the
Edge Shade at 30.
It’d be nice if you could select the edge color. In the future, I may build upon this filter and add a edge color setting.
Cleaning The Texture
Now comes the second clean up phase. In this phase, perform the following in order.
- If tiling the image, remove any distracting repetition that wasn’t dealt with earlier.
- If tiling the image, remove any seams added by the filters. The procedure will be the same as up above.
- Adjust the curves (value, red, green, blue) if needed.
- Lightly sharpen the image using the
Sharpen [Deblur]G’MIC filter but be sure to avoid adding any noticeable highlights and shadows.
- Resize the image to its final dimensions. Make sure your dimensions are a power of two if required or recommended by your game engine.
Your hand-painted texture is now done and you saved a ton of time in the process. 🎉 However, you’re not done yet. Time to create the maps to make it work with any kind of lighting.
Create The Maps
One of the problems with hand painting textures is deciding on the light direction. It’s typically chosen as directly up above and this works more or less with the dynamic lighting in the game. However, this may not work in all situations.
With the texture finished, load it into AwesomeBump to generate the normal and occlusion maps. The interface can be confusing so I’ll walk you through it.
- On the main toolbar to the left, click the “Show diffuse image” button.
- Click the “Open new image” button and select your texture.
- Under “Diffuse to Others”, check “Enable preview”.
- With “Enable preview” checked, scroll down and click the “Convert” button.
- Uncheck the “Enable preview” button.
- On the main toolbar to the left, click the “Show occlusion image”.
- Set the “Input image” to “Height (input) + Normal (input)”.
- Press the “Save current image” button and save your occlusion map.
- On the main toolbar to the left, click the “Show normal image”.
- Press the “Save current image” button and save your normal map.
You should now have your diffuse, normal, and ambient occlusion maps.
Putting It All Together
With your maps in hand, you can now head over to your modeling program (I use Blender) and assemble your material.
I performed the same process to create a wood, roof, grass, and metal texture. Here you can see them all in use, texturing a well I modeled.
Using only a few free tools (GIMP, G’MIC, and AwesomeBump), I’ve put together a fairly easy process for creating diffuse, normal, and occlusion maps that approximate the hand-painted game art style.
While developing Lambda Lantern — for the GitHub Game Off game jam — I had to skip texturing to save on time but I plan to go back and texture all the models (and any new ones) using this process. This should add some great detail to an already nice art style I chose.
Anyway, hopefully this will save you some time when developing your own games. If you happen to use the process, be sure to share your creation in the comments below. 😃 👍