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.

Everyone’s favorite hand-painted texture — the brick wall.

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.

  1. Crop the photo to have the same aspect ratio that the final texture will have but do not resize the photo just yet.
  2. If tiling the image, remove any distracting repetition.
  3. 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.

I make all my GIFs with Gifcurry. 😃

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

If you don’t already have it, make sure to install G’MIC. I use it as a GIMP plugin but you can also use it online.

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 Gradient Smoothness.

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.

For the Brush parameters, use the ellipse shape with a very small Ratio. The 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.

For the 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

After 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.

  1. If tiling the image, remove any distracting repetition that wasn’t dealt with earlier.
  2. If tiling the image, remove any seams added by the filters. The procedure will be the same as up above.
  3. Adjust the curves (value, red, green, blue) if needed.
  4. Lightly sharpen the image using the Sharpen [Deblur] G’MIC filter but be sure to avoid adding any noticeable highlights and shadows.
  5. 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.

  1. On the main toolbar to the left, click the “Show diffuse image” button.
  2. Click the “Open new image” button and select your texture.
  3. Under “Diffuse to Others”, check “Enable preview”.
  4. With “Enable preview” checked, scroll down and click the “Convert” button.
  5. Uncheck the “Enable preview” button.
  6. On the main toolbar to the left, click the “Show occlusion image”.
  7. Set the “Input image” to “Height (input) + Normal (input)”.
  8. Press the “Save current image” button and save your occlusion map.
  9. On the main toolbar to the left, click the “Show normal image”.
  10. 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. 😃 👍