Techniques for Making Stock Textures More Realistic in 3D

Spread the love
content entry-content–single”>

A new way to generate rendered images: let’s discuss combining 3D textures with a more recent technique, Physically Based Rendering.

Texturing 3D models has always been a creative process where artists use their own skills and experience in order to produce interesting results in their artworks. With the advent of new technologies, there are several tools and techniques that can help artists while texturing.

While using bitmaps is one of the oldest and most common texturing techniques, the end result may not always stand up to the demands of today’s requirements for realistic 3D models. Today we’ll talk about combining this technique with a more recent and highly in-demand technique—PBR (Physically Based Rendering). PBR has given artists a new way to generate rendered images (and related texture maps) that better represents the way the light behaves in the real world.

Three Common Approaches for Texturing 3D Models

  • Using 3D textures (bitmaps) coming from specialized websites: Shutterstock, for instance, provides users with tons of images and textures for every need. In this case, textures must be treated in 3D software to be correctly mapped on your 3D models (e.g with Photoshop).
  • Using only procedural techniques: This requires some specific knowledge, but allows more freedom in the creation of patterns and distribution of elements by rules. Different softwares come in handy while using procedural approaches. Substance Painter, as well as Substance Designer, are examples of material-authoring tools. The images below show a terrain that I procedurally created in Substance Designer. Notice that leaves can be easily deleted from the surface, as both textures and geometry are procedurally generated. And, after adding the manhole, the other elements redistributed accordingly.
  • Combining the power of the previous techniques with both bitmaps and procedural textures: In this case, the benefit of this mixed approach is that we start from a well-determined image and enrich it with details. Think about the possibility to load the bitmap image and add a procedural layer (e.g. dirt map) directly onto it, creating a more realistic model.

I’ll be following the latter approach for the rest of the article, with supportive examples and advice that artists can easily follow up.

Preparing Your Props for Texturing

Whether you start from a planar surface or a complex model, the first thing you need to check is the presence of UVs. This allows you a correct mapping without any kind of distortion.

For our demonstration, I’ll be using simple shapes to map the textures, as our goal is to focus on the texturing itself.

Assembling Assets

Download your preferred image from Shutterstock—any resource that suits your needs is fine. If your goal is to create some tileable material, type the word “tileable” in the search filter.

In our example, we’ll consider the following texture from the Shutterstock library as a starting point, and I’ll demonstrate how you can easily enrich it with details and features.

Wood Texture
Begin by downloading an image from the Shutterstock library. Image via Amethist.

We’ll choose an interesting workflow to change the look of our texture and combine the power of masks and filters to generate variations to our material. In order to accomplish this, I’ll take advantage of a tool called Substance Designer.

Texture Maps to Be Generated

As a texture artist, you may already be aware of PBR as a way to generate compelling textures. If not, here’s a short explanation of the basic concepts. 

I’ll be using the metal/roughness workflow, which requires some preliminary maps to be created. (You can also brush up on those concepts here.)

Here’s the list of the fundamental texture maps that we’ll be creating:

  • Base Color
  • Normal
  • Roughness
  • Metalness

Then, other additional maps like:

  • Height
  • Ambient Occlusion  

And finally, other utility maps (e.g. curvature map), which we will use for creating maps in order to add details (more on that later on).

Basic Setup in Substance Designer

Let’s import the bitmap from Shutterstock in our Substance Designer graph with a bitmap node—that simply represents the base color map. In the final result, we will apply a filter in Designer to darken the base color.

Let’s import the bitmap from Shutterstock in our Substance Designer graph with a bitmap node—that simply represents the base color map. In the final result, we will apply a filter in Designer to darken the base color.

Conversion Node
Connecting the bitmap node to a Grayscale Conversion node.

To have more control over the details in both normal and height maps, we can work on the histogram by using a Level node. The grayscale image is less contrasted and brighter. The output then connects to a normal map node where we can decide the normal map strength.

Level Node
The grayscale image is less contrasted and brighter.

The high frequency details (in this case) can be stored in the normal map as they are. While for the height map, it’s good to mainly preserve the main shapes. The easiest way to accomplish this is to blur the grayscale output a bit (Blur HQ Grayscale node). If we don’t blur it, the result will be too noisy for a height map.

Grayscale Output
You’ll want to blur the grayscale output.

The roughness, which describes the quality of the specular reflections, can be created by inverting the values of our current grayscale map. The reason behind that is to have more reflection where expected in the image. The inverted map is then blurred and a level node is applied to have control over the roughness values.

Alternatively, I could have used a curvature map to isolate the concave and convex areas. However, the first approach worked better for me in this particular case.

The roughness can be created by inverting the values of our current grayscale map.

The metallic map is the only texture to be ignored because we don’t have any metallic element in our texture, so it remains black in PBR terms.

Finally, the Ambient Occlusion map creates soft shadows in occluded areas and is useful to improve the quality of our material. In this case, the HBAO node is what we need. It simply takes the normal map as input. Blur the result a bit to soften the shadows.

Ambient Occlusion
The Ambient Occlusion map creates soft shadows in occluded areas.

With the previous basic setup, you already have everything you need to use your material! The result is tileable and can be mapped to any 3D model like walls, floors, etc.

Here I’ll show you the results mapped to a cylinder in Substance Designer for the details we’ve built thus far.

I created the render in Marmoset Toolbag 4 by using PBR textures and with metal/roughness workflow. Notice how the normal, the height, and the roughness information increases the quality of the results. 

In the next image, a render with all the information but the base color. You’ll notice how the normal is more responsible for fine details, while the height is for big shapes.

Normal vs. Height
This image contains everything except the base color.

Adding More Details to Your Texture

With the previous workflow, you already have nice material to work with, but I want to show you how to add more details and features. Let’s think about adding dust, dirt, procedural elements on the wood planks, etc. Creativity is our friend!

The purpose of this part is to discuss some techniques and methods you can use to enrich your textures. However, it’s not a step-by-step guide through the Substance Designer graph.


Every object in the real world has some level of dirt because of its surrounding environment. Dirt accumulates in recesses and occluded areas, but you can also observe it, to some extent, on the surface itself.

In the following example, I used a simple network to generate a level of dirt onto our material.

The idea is quite simple, though. I use a combination of a Curvature map with a Mask Generator called Selective Dirt. The curvature map works as a guide to help the generator create a mask to place the dirt.

Here’s the network:

Here’s a simple network to generate a level of dirt onto our material.

The Selective Dirt node takes the curvature map and an optional mask (in the example, I experimented with two different masks I created from our source texture). At the end, I added color to the dirt by using a Gradient Map node and merged it with the base color by a multiply operation (Blend node).

(The roughness map, which will not be explained here, has been also modified a bit to reflect the presence of dirt.)

Gradient Map
Dirt Details
Inserting dirt details.

This quick render made in Marmoset shows some dirt and color correction to make the wood material darker.

Dirt Render
A quick render made in Marmoset with some dirt and color correction.

Adding Procedural Elements

If generators and masks help with details like dirt and dust, why not consider procedural elements to improve our materials? I usually save materials in my personal library so I can re-use them in the future.

Real-life Details

For instance, let’s consider these cigarette butts that I created for another project.

Cigarette Butts
Adding realistic details to your image (a.k.a. cigarette butts).

The purpose here is to show the potential of procedural elements and the possibility to extract them from one project and place them into another.

Any of the previous elements are procedural and created from scratch, and that gives us the possibility to scatter the elements.

Let’s place the cigarette butts onto our wood material.

Adding Details
Extracting a detail from one project and inserting it into another project.

In the previous viewport, you see how the cigarette sits on the ground plane. Think about creating a bar scenario where you’re asked to create a floor with some details. In this case, the presence of a few cigarette butts is representative of the location you’re trying to create.

It’s much more interesting if we add the previous dirt layer!

Cigarette on Wood
Adding dirt on the wood goes perfect with the discarded cigarette.

In the previous renders, I showed an example of how you could use our material with the PBR setup, the dirt layer, and the procedural cigarettes on the ground (I increased the scale of the height map to give more depth to the composition).

Furthermore, I moved one step forward and worked on the mood where there’s an evident key light coming from the right side with a gobo (the mask projecting hypothetical trees off camera).

Tree Shadows
Add some tree shadows for a more realistic take.

Without getting into too much detail, I’d like to show you the idea behind the use of procedural elements. 

There’s a useful node in Designer called Tile Sampler, which I use a lot to create procedural patterns—rocks, bricks, etc.—but it can also be used to scatter input elements, which is the case for the cigarette butts.

I used:

  • Tile Sampler with custom parameters, that generates an output for the height map, and the base for the roughness and the normal map.
  • Tile Sampler Color works in combination with the tile sampler (with the same parameters), but generates the base color.

The Tile Sampler is a rich node because it has several parameters. Just to name a few:

  • Pattern input (the cigarette in my case), with the amount in X and Y direction
  • Position
  • Position random
  • Rotation
  • Rotation random
  • Size
  • Opacity
  • Size random

For our material, I decided to scatter a few cigarettes, but you can experiment with the node and find the most interesting distribution.

Tile Sampler
The Tile Sampler generates an output for the height map, and the base for the roughness and the normal map.


As the last example, we’ll see how to add a further level of detail by introducing scratches.

Since we already have small details coming from our normal map, I decided to add bigger scratches and combine them with our details. The idea is to make them follow the wood direction but with some sort of randomness.

In the previous example, we simulated a wooden floor with details. In this case, I’d like to show you how our texture can be mapped to a cube with the purpose of simulating a table top.

We have our cigarette butts and the dirt (as before), but we are also introducing a level of scratches. 

Slide the bar to see the image without the scratches vs. with the rendered scratches. See the difference?

Here’s the render without scratches:

As always, there are many ways to generate scratches on our bitmap. In my case, I created the following graph in Substance Designer:

Substance Designer
Creating the scratches in Substance Designer.

Nothing too complicated, but I’d like to give you a general idea about what the previous network does.

  • We start from a couple of Grunge Maps 5 that come directly from Substance Designer (I called them Scratches 1 and 2). They’re the base for our scratches.
  • We apply Transformation 2DDirectional Warp, and Levels nodes to change the look of the scratches, as well as their intensity, orientation, and so on.
  • We then combine the two scratches.
  • The result is also combined with a Directional Noise 4 and Perlin Noise
  • The final Blend node, performing an Add/Sub operation, produces a more interesting pattern.
  • We then perform a Directional Warp operation. We want to make sure that scratches break a bit when they pass from one wood plank to another. That’s done by creating a custom mask which captures the edges separating the planks. When the mask is used as input in the directional warp node, the carving breaks a bit and the output has a more realistic look.
  • As a final operation, we blur the result a bit and store the info in a normal map node. This map is combined with our previous normal map.


So, we’ve described a workflow in order to create PBR materials starting from a bitmap.

In the introduction, we listed three approaches but focused on the third one, with the possibility to mix bitmaps with procedural techniques just for the purpose of this article.

Next we defined a basic setup which generates PBR materials directly into Substance Designer. The result is pretty straightforward and requires few nodes to create the outputs.

In the second part, I instead showed you how to enrich the basic material with different elements. The purpose here is to create some variations of your materials, with the possibility to export the output in order to texture different 3D surfaces.

In particular, we described the general guidelines to add:

  • Dirt
  • Procedural elements (like cigarette butts)
  • Scratches

I created the rendered images in this article directly in Marmoset Toolbag 4, but any render engine can obtain similar results.

For example, I used Substance Designer throughout this article, but you can create a similar workflow with other tools like Substance Alchemist (at least some parts). In my opinion, Designer has more flexibility while creating procedural elements and, for that reason, I opted for it.

Final Bits of Advice

Here are a few more quick tips to help inspire you when texturing your models:

  • If you want to speed up your workflow in the creation of materials, choose your best bitmaps as a starting point. For example, say you’re in the middle of a project with a strict deadline and you must texture a big 3D asset. By starting from generic textures, you can save time and concentrate more on details.
  • Don’t consider the first image from the nternet and don’t be afraid to look for high-quality bitmaps. The higher the quality, the easier to work with.
  • Spend some time cleaning up your textures, if needed. The generation of the initial PBR material is vital for the entire work. For instance, some textures can have high-frequency details that you don’t need in your height map, and for that reason, you need some filters to remove them. In the past, I used a tool called PixPlant, which helped me generate my maps from a bitmap by removing or keeping details case by case. Designer is also perfect for that. It has many filters that come in handy.
  • When you’ve generated your PBR material, you’re ready to release your creativity! With tools like Substance Designer, as we saw, you can change the look of your textures and create as many variations as you desire. Spend some time learning Designer. It might seem a bit complicated at first because of its node-based nature. But, rest assured, you’ll find it extremely useful for your future projects.
  • The benefit of Designer is in its non-destructive workflow. Practically, your changes don’t have any impact on what you’ve already done. You can add a new layer without breaking your existing network.
  • With the suggested workflow in Designer, create a number of materials and variations to keep in your personal library. As a next step, you could take advantage of Substance Alchemist, for instance, to mix your pre-existing materials and create new ones.

Get creative and have fun with it!

For more design tips, tricks, and advice, check out these articles:

Join our community of talented artists,
filmmakers, and musicians.

Posted by News Monkey