Skip to main content

Approximating from a Bitmap

As the easiest and fastest method of creating PBR materials this is the way that most people (including myself) create their textures when they start out.

In this part we will shoot a number of overlapping images and stitch them together to one high-resolution texture. We will then edit this texture to make it seamless and finish by approximating the PBR maps for the final material using software. In this example we will go through the creation process of Paving Stones 018, originally released on June 22nd 2018.

This is an older article which uses the software Substance B2M which has since been replaced with Substance 3D Sampler by Adobe.

The shooting process

Once you have found a suitable surface start taking pictures in a serpentine pattern and make sure that there is always enough overlap between the images. ICE needs these overlapping areas to piece the images back together. Here is an example how the pattern should look:


While shooting the images it is also very important to always keep the camera in a 90 degree angle to the ground or wall. The stitching process is only going to work right if the images only show planar motion from one to the other, perspective changes may lead to problems during the later steps. For that reason I would consider a three-legged tripod to be slightly better than a monopod in this use-case.

In the end you should have a couple dozens of images.



Once you have covered a large enough area copy all files to your computer and open up Microsoft ICE. Create a new project, import the images and set the projection method to ”planar” in the first step. Then click on ”NEXT” to start the stitching process. ICE will now try to construct the raw texture. Depending on the computer and the size of the imageset this step can take up to an hour. Once the alignment and the compositing have finished you will get a first view on your texture. The steps 2 & 3 offer further projection settings and options for cropping. If you want to save on diskspace you can already do a rough crop in here, though I like to export the entire canvas at first in order to not lose anything. In step 4 you can save your stitched texture as an image file.


The final image can have a resolution of more than 15000px, but as you can see the stitching has introduced a slight perspective distortion which we will need to remove in the next step.

Cropping and perspective correction

Before we can start making the image seamless we first need to do some preparation work. The first step in this process is to ensure that all visible patterns are roughly aligned and match up around the edges of the image. In many cases this is achieved by simply cropping and rotating the image, but if the texture’s structure has been warped by the panorama projection then perspective correction may be required. Open the output from ICE in an image editor of your choice, but keep in mind that the image will need to be opened in Krita in the next step, so it would be smart to open it in Krita in the first place. But Krita is not very capable when it comes to handling extremely large images, that’s why I do the preliminary cropping and perspective correction in Affinity Photo instead. You’ll have to try out what workflow works best on your computer.

I start by creating some guide lines that encapsulate an (approximately) square area. The guide lines are exaggerated in the following images to make them easier to see.


I then use the perspective transformation tool (available in nearly every image editor) to create a rough alignment to the square I just marked out.

After that step the texture looks like this…


…at which point it can be cropped down.


The texture now has a somewhat tileable structure but if you were to try it at this point you would still see visible seams. The next step takes care of that.

Making it seamless

Now we are going to turn the perspective-corrected image into a seamless texture - or maybe not (yet). The question you’ll have to ask yourself at this point is:

“Can I wing this?”

In this context “winging it” means letting your software (Substance B2M/Substance Alchemist/Materialize/…) do the tiling for you. This generally works pretty well for homogeneous or random structures but not at all for surfaces with clearly aligned elements such as bricks or paving stones.

Can usually be handled by algorithms:

  • Dirt
  • Sand
  • Asphalt
  • Gravel

Usually requires manual tiling:

  • Paving stones
  • Bricks
  • Tiles
  • Planks

If your texture seems to be suitable for automated tiling just continue on to the next step - you can always come back if things don’t work out.

If your texture requires manual tiling I would highly recommend using Krita due to its tiled viewport feature which makes editing and evaluating textures a lot easier. Now is the time to export your cropped image from whatever editor you were using, load it into Krita and press W or go to View → Wrap Around Mode. You’ll now see a tiled view of your texture. The neat thing about Krita’s tiled viewport is that it is not just a preview - you can actually interact with it an use tools across the seams. This makes the process much more interactive and gives you a much better idea of what the texture is going to look like. At the start your texture might look something like this:


Before I start using the clone brush I like to zoom out (like in the picture above) to find large/gradual differences in color or brightness. In this case it is pretty obvious that the bottom left corner of the texture is significantly darker than the rest of the image. That needs to be fixed first, otherwise this difference in brightness will be a noticeable distraction in the final texture - even if the pavement itself lines up nicely.

To fix this I duplicate the texture onto a new layer and add a transparency mask to the copy. I then use the gradient tool on the mask layer to create a black and white gradient across the bottom left corner (The gradient Tool does not make use of the tiled viewport, but that’s actually a good thing in this situation). Here is the final layer setup, you can see the small white corner on the transparency mask:


At this point nothing has visibly changed. But now it will: Select the top layer and open the color adjustment curves. I adjust the brightness of the masked area, the difference is clearly noticeable.


At this point the texture is ready to be made seamless. I mainly use the clone brush to carefully paint over the texture’s seams and to connect the paving stones to one another.


Creating the Material Maps

The final step is creating the displacement-, normal-, roughness and other maps. Since we only have a single color map to work with, everything will need to be approximated from it. Giving a concrete list of buttons to click and values to choose during this step is sadly impossible since every texture comes with its own challenges and potential pitfalls. All texture approximation tools have a large interactive viewport for a good reason: At this step there is a lot of experimentation involved. My recommendation is to turn down the preview resolution in your software of choice and quickly iterate over a lot of different settings. Just play around with all the sliders! We are extrapolating a lot of data from just one color map anyways, so don’t worry about not getting everything 100% right.

The exact workflow also varies from software to software. Here is the general order of steps and procedures that I take when creating a texture in Substance B2M, many of the tools are available in other programs as well, just under different names.

Start with the displacement/normal map

They are the hardest to get right and a lot of other maps depend on them. Most tools offer different sliders for large, medium and small details. In most cases I end up increasing the medium details while decreasing the larger and smaller details. Here are the relief settings for this texture:


See if Ambient Occlusion makes sense

Having an ambient occlusion map is only useful if your surface has strong displacement that causes crevasses to be visibly darker by receiving less ambient light. If that’s not the case (for example in the case of an almost entirely flat parquet) then you can disable the ambient occlusion map.

Delight the color map

After having a decent displacement map I usually focus on the color. The delighting can work in many different ways - Substance Alchemist even offers an AI based delighter. But the two most common methods are based on the displacement and direction of light and/or the ambient occlusion. In Substance B2M they are called “Light Equalizer” and “AO Cancellation”.

The Light Equalizer is useful for removing hard or hard-ish shadows from the texture. It takes in the direction of the of the light in the original image (and the displacement map which should already be configured at this point) and tries to estimate where shadows could exist in order to brighten these areas. If you have followed the steps in What Makes A Good Material then you probably won’t need this type of delighting.

The AO Cancellation uses the ambient occlusion map to determine which parts of the image would naturally be darker in the unprocessed texture and then brightens these parts. I primarily use this method when creating textures.

Create a roughness map

There are two ways to get roughness data. Roughness can be approximated from the displacement map (or rather the curvature which is derived from the displacement map). This method is great for creating small differences on surfaces with fairly uniform roughness. In Substance B2M this method is referred to as “Roughness from Curvature”.

It can also be influenced by the color of the texture. One thing I like to do when working with bricks (for example) is to use random color variations between the bricks to create randomness in the roughness map which would otherwise be very plain due to the bricks uniform structure. Here is what that can look like (Bricks 016):


Comparison between material creation tools

Here is a comparison between three different material creation tools: Substance Alchemist, Substance B2M and Materialize. I tried to put the same effort into tweaking the values in each software.


You can see: The differences between the different tools are marginal, none of them can do magic. This doesn’t necessarily mean that the paid programs are a bad deal (especially Alchemist has a lot of other capabilities for creative edits) but it shows that you don’t need to worry too much about not having the exact tools that I use for texture creation - especially if they cost money.