How To Create Hand Painted Textures Without Painting

Lettier
10 min readJan 13, 2019

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.

The nice thing about this technique is that you can dial in how much or how little stylization you want.

Using it on a variety of textures, I haven’t found a case where it completely fails to give that hand painted look.

Finding A Photo Texture

Link to the original.

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.

Preparing The Photo

Depending on your needs, you might be able to skip the photo prep. However, in the interest of documenting the most involved case, I’ll demonstrate the technique by creating a seamless/tileable, square, power-of-two texture which tends to be the most versatile.

Click the image to enlarge it.

The photo I’ve chosen is a bit bowed so you’ll want to straighten it out before you do anything. You can do this with the warp tool.

Next, crop the photo where the width and height are the same size and a power of two (256x256, 512x512, 1024x1024, etc.). To help make the texture seamless, try to crop it in such a way that the left and right and the top and bottom sort of mirror each other.

If you don’t already have it, make sure to install G’MIC. I use it as a Krita plugin but you can also use it online. With G’MIC open, find the Make Seamless [Diffusion] filter. This will help remove the seams without having to use the heal/patch or clone tool.

The seams should be more or less gone now. However, the Make Seamless filter tends to introduce uneven lighting so you’ll have to play around with the Equalize Light setting. If the Equalize Light setting doesn’t work, you can try the Normalize Brightness filter after using Make Seamless.

Splitting The Details

With the prep done, we can now move on to the stylization.

With G’MIC open, go to the Split Details [Wavelets] filter. Set the Number of Scales to four and click apply. The first split is the small details, the second is the medium details, the third is the large details, and the fourth is the residual or what’s left over. You can try more or less splits but I’ve found four to be the ideal number.

After splitting the details, rename the layers 1 through 4 so you can easily reference them later. Layer 1, 2, and 3 should be set to Grain Merge. After setting the blend mode, you’ll notice that you have the original image back.

Adding The Brush Strokes

It wouldn’t be hand painted without brush strokes. After splitting the details, run layer 4 through the Brushify filter found in G’MIC.

Under the Brush Parameters, set the Shape to Rectangle, the Number of Sizes to 2, the Maximal Size to 45, the Light Type to None, the Light Strength to 0, and the Opacity to 1. These are the ideals settings I’ve found but feel free to experiment. Depending on how “painted” you want it to look, play around with the Number of Sizes.

💡 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 Details

Recall that our goal is to remove just enough detail to reveal the hidden hand painted texture underneath. Layers 1 through 3 hold the small, medium, and large details respectively. For layers 1, 2, and 3, you’ll want to smooth out the details until they each have that chunky, painterly look.

With G’MIC open, navigate to the Smooth [Thin Brush] filter. I’ve found this smoothing filter to work the best for this step but feel free to try the others. The goal here is to retain the important edges or contours while blurring out the rest.

Here you see me smoothing out layer 1. I take out most of the detail, retaining just a slight hint of the surface detail found on the stones and moss.

Seamless

After using Brushify on layer 4 and Smooth [Thin Brush] on layers 1 through 3, we have seams again. To remedy this, apply the Make Seamless filter to layers 3 and 4. You can try it on layers 2 and 1 but I’ve found it does more harm than good.

For example, here you see Make Seamless applied to layer 2. Notice the uneven lighting where it looks pinched in certain spots.

To remove the seams in layers 1 and 2, use the clone tool to lightly smooth away the obvious edges.

⚠️ Be careful not to introduce phantom details by cloning some detail that wasn’t there before.

Creating The Normal Map

So far we’ve been working on the diffuse map. The diffuse map defines the color of your game model as if it was fully lit. However, we’d like to incorporate the surface details we see in the diffuse map into the shading or lighting performed by the game engine. To do that, we’ll need to create a normal map.

💡 To learn more about the technical side of normal mapping, be sure to check out 3D Game Shaders For Beginners.

Before creating the normal map, take a look at layers 1 through 3 and decide on how much detail you would like to incorporate. Typically, layer 3 is enough but sometimes I add in layer 2 as well.

After you have decided how much detail to include, copy the layers and merge them together. Move this layer up above 1 and set its blend mode to normal. Now take this layer and desaturate it using the average setting.

At this point, you’ll want to look up how to create a normal map using your preferred program. For Krita, it has a built-in filter called Height to Normal Map. Select Filter ▶️ Edge Detection ▶️ Height to Normal Map and choose from either Prewitt, Sobel, or Simple. I tend to use Sobel or Simple the most. If the details are extra light then I’ll choose Prewitt. After clicking OK, rename this layer normal and hide every layer.

Creating The Cavity Map

From the normal map we’ll create the cavity map. The cavity map allows us to highlight the sharp ridges and shadow the narrow crevices found in the texture.

Select the normal map and then navigate to Image ▶️ Separate Image. This will separate the normal map into its blue, red, and green channels.

Select the blue layer and set it to multiply. Select the green layer and set it to overlay. With the green layer still selected, navigate to Filter ▶️ Edge Detection ▶️ Edge Detection. Like the normal map, select from either Prewitt, Sobel, or Simple. For the green layer, set the Output to Bottom Edge and click OK. Now do the same for the red layer but this time set the Output to Right Edge.

After the edge detection, merge the green layer into the red layer and then merge the blue layer into the red layer. Rename this layer cavity and place it above layer 1. Set the blend mode for cavity to overlay.

The cavity map most likely has seams so you’ll want to try using Make Seamless and if that doesn’t work, clean up the edges using the clone tool like you did before.

At this point the cavity map is finished but you may want to adjust its contrast in case the highlights are too harsh and/or smooth it out with the Thin Brush filter if it’s too noisy.

Creating The Occlusion Map

The last map we’ll create is the ambient occlusion map. This map allows us to shadow the larger recessed regions in our texture that receive less light. Your game engine can also use it when it applies the ambient lighting.

The cavity map and ambient occlusion map tend to overlap but in general the ambient occlusion map shadows the larger occluded areas while the cavity map handles the smaller occluded areas. The cavity map also highlights the sharply raised areas.

Similar to the normal map, select, copy, and merge the details layers you would like to include in the ambient occlusion map. Once merge, desaturate this new layer using the Min option.

With G’MIC open, navigate to the Basic Adjustments filter. Play with the brightness and contrast until you have the desired result. You'll want the raised areas to be white and the recessed areas to be a soft grey. When you have the look you want, press Apply and set this layer’s blend mode to multiply.

Color Correction

The stylization process is now complete but before you export you may want to perform some color correction on layer 4.

I enjoy using the G’MIC Basic Adjustments filter for this step.

Another filter to try is G’MIC’s Auto Balance. This may not always work but when it does, it can definitely save some time when you’re trying to get the colors just right.

Just before I export, I like to toggle on and off the original. This allows me to see how much of a change I made, whether or not I got all the details I wanted, and if I overdid it with the color correction.

Putting It All Together

You now have your diffuse, normal, ambient occlusion, and cavity map.

GIF created with Gifcurry.

With these maps, you can now move over to your modeling program (I use Blender) and assemble your material.

GIF created with Gifcurry.

In this scene, I used the same process described up above to create the wood, roof, grass, water, rope, bark, butterfly, rock, leaves, shrub, and metal texture. I’ve uploaded the model to Sketchfab so you can take a closer look.

Using only a couple of free tools (Krita and G’MIC), I’ve put together a fairly easy process for creating diffuse, normal, cavity, and occlusion maps that approximate the hand-painted game art style.

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

--

--