Pablo Blanes has shared an extensive breakdown of the 3 Set PBR Wood Bark project, detailing his workflow in Substance 3D Designer and sharing some tips and tricks on creating procedural materials.
Introduction
Hello everyone! My name is Pablo Blanes, and I am a 3D Artist, specializing in Texturing and Environment Art. I come from Madrid, the place where I started my entire professional career. I loved video games since I was a little child, I started playing when I was really young. My passion for it developed in the interest of studying how games are done, so that’s why I ended up studying for a video games degree at the University of Madrid, ESNE.
I completely fell in love with 3D art, with the environment creation, and all that is related to it. Once I finished my degree at the University, I studied a post-degree focused on art for video games at Voxel School, an Academy also based in Madrid.
At the end of my post-degree, I was hired as Junior Environment Artist in an Outsourcing company, Secret 6 Madrid. During my time working at this company, I learned a lot about video game creation, correct pipelines in order to deliver AAA assets, environment art creation, etc. I worked on several projects, but the most important one was MediEvil PS4 Remake.
After that company, I moved to Mercury Steam, where I worked as an Environment Artist on Metroid Dread.
Currently, I am working at Ubisoft Quebec, Canada, where my role is a Texture Artist. I wanted to work outside my home country, so when I got an offer from this company, I took the shot. I feel really happy and lucky to work for a top company such as Ubisoft, with other talented artists, feeling that I am improving all my skills as an artist and learning a lot while working on amazing projects.
Substance 3D Designer
Since I am a Texture Artist at Ubisoft, my main task usually is related to material creation. In my free time, I like testing myself and practicing texture creation on my own. I always try to look for challenging personal projects, where I can feel I improve a little bit my skills. There are many ways of tackling a texture, I think it depends on the artist how to develop a texture but usually, I use Substance 3D Designer or ZBrush for achieving these textures. For this specific one, I used 100% Substance 3D Designer, to get all the workflow procedural.
In order to learn Substance 3D Designer, I think it’s good to see some tutorials online, there is plenty of documentation on the Allegorithmic website, and also there are some top artists who have awesome tutorials like Vincent Derozier, Daniel Thiger, or Joshua Lynch. I’ve watched plenty of those tutorials, you can learn a lot of stuff from them, and gain enough knowledge to create your own materials, and from that point onwards, I believe all you need to do is to practice a lot.
Substance 3D Designer can feel a little difficult or way different compared to other software. In my case, I started doing textures with Substance 3D Painter and tileable materials with the Standard workflow in ZBrush.
Coming from another pipeline like the one I used in ZBrush for the textures made me feel in Substance 3D Designer a bit lost at the beginning, but once you "understand" how it works, I feel it is a really fun program to learn and practice. It was easy to get addicted to testing the results of different nodes and effects, and easily you can see the power and potential that the software may have. In productions, regarding the texture and material creation, it is really easy to make changes or apply feedbacks that you may have been given, so it makes it pretty useful for video game creation.
Bark Textures Set
Why wood? Why Bark?
Usually, when I walk in the street, in natural areas, I tend to look at different surfaces. Sometimes, I even take pictures of some of them that I may use in the future for personal projects. In this case, there was a long time since I last explored a nice good looking bark, and I wanted to take the time to try this one.
Wood barks are really interesting in my opinion. There are plenty of different patterns and different ways the surfaces work, so you can get a lot of variation within it.
When I started this project, my main targets were the following:
- Making wood barks in a realistic style;
- Creating several sets of textures that would really differ from each other;
- Keeping them procedural;
- Trying to fit them in a real photograph.
So, first of all, I had to look for references. I’ve got plenty of references which I can use to get nice ideas and several pictures that can inspire me so that I would be able to achieve the detail I was looking for. Since I wanted to have several materials, I searched for several types of wood that may inspire me.
These three pictures were my main reference for each of the materials. I wanted to have a lot of variety between them and be able to explore different approaches of a diffuse and a Height Map.
I had plenty of references but having a couple of them as the main ones helped to focus on some detail specifically as one of the pictures, and don’t get a mix between all of them. The other references could help me in case I wasn’t sure how a volume was working, or to get a nice close-up on some of the barks.
Getting Started
Some artists have their own presets on the graph, depending on how you work or what you want to achieve. On my side, I usually keep it simple and dig into the material. My main outputs for the three materials were Base Color, Normal, Roughness, Ambient Occlusion, and Height.
Since this surface didn't have any special effects, like a kind of translucency, or opacity, I thought that with the standard template, I should have been able to achieve the look I was looking for.
Inside Substance 3D Designer, you have the option to choose between different shapes to apply your texture. In order to get a good perception of what would be the final result, I decided to create a cylindrical geometry, with the correct UVs mapping, so I always could have a good projection of my texture and could see how the materials were working on shape more similar to a tree.
My setup was ready, so I was ready to start.
It is not necessary to always change the shape inside Substance 3D Designer to a shape that you created externally. Depending on the material or what you need, you may change it or not. In this case, I thought it was necessary so that the scale, the size of the patterns and shapes, and the microdetail could fit together.
Set 1
The image you can see above was my main reference for the first picture. The first thing I tried to see when I was developing material was to try to see what is the pattern of repetition. I tried to look for the basic shapes that formed the surface I was looking for. It’s always easier to add microdetail and some sculpting details if you have a good pattern and nice basic shapes.
As I saw, the main pattern of distribution of the bark is based on rectangles that go in a straight direction, intersecting with each other by with a uniform shape, more or less.
For the beginning steps, I decided to use a Tile Sampler. It is a very powerful node, in which you can scatter different shapes and have plenty of control over them.
Is pretty easy to change the size and the rotation a little bit – the node is very powerful if your main objective is to scatter some shapes in a certain way. In my case, upscaling the size, adding some color randomness to the shape, and mixing between two shapes (in this case, a sphere and a rectangle), gave me an interesting pattern.
For this pattern, I used a Distance Node (with a really high value) and an Edge Detect – and after that, I got a clean pattern in black and white, of our shapes.
With a Directional Warp, I came from what you can see in the left picture to the pattern in the right picture. Directional Warp is a really interesting node because it deforms your shapes depending on the input that you connect to the node. It's really powerful to create the chips or bites to the shape, to make it lose the "perfectly" rectangular or spherical shape that your pattern could have. You also can manage the intensity with a slider.
Having this pattern, my next step was connecting it to the Flood Fill node. This allowed me to get control of having gradients and grayscales per shape inside my pattern, which give me a nice effect.
The Food Fill also gave me the possibility to create a map with random colors, so I could also break the continuity of some grunge patterns.
Going back to the black and white pattern is always interesting to bevel the shapes a little bit (but not too much, since this node can dark the Height Map easily). Besides, in this case, the shapes were pretty sharp in the reference, so I might keep them like that.
Connecting the Flood Fill node to a Flood Fill to Gradient created a mix of gradients on each shape, which let me create different heights on each piece of the bark. With this detail, I was able to make them slightly go out, each of them a little different. In the reference, I could see that each one of the bark start to separate from the main trunk of the tree, so with this workflow, I was able to create this effect.
It's quite obvious that each shape is separated by a black line. Although sometimes this can be on purpose, in my case it was too visible, so I tried to make it smaller or barely visible. In the Edge Detect node, users can control the thickness of this intersection, but there is always going to be a tiny intersection, and for the Flood Fill, I needed that black line. But once I already got the Flood Fill node, I could try to get the same effect but without the intersection.
Using a distance merging the two maps – you can see that in the picture above– I got nice gradients without the black line.
Also, since the Flood Fill can also create Grayscale Maps taking into account each shape, I could create plenty of masks to blend between one pattern of gradients with another one.
This doesn't only apply to mask creation – if you use the Grayscale directly in the Height Map, you'll create an effect on different heights in each of the shapes, which can help you to create an interesting effect. Anyway, for now, I would recommend not to be too intense on this effect.
On another branch of the graph, I used the Slope Blur to break the shape a little bit and create something like bites.
Using another Bevel on the shapes and combining it with the Grayscale from the Flood Fill that I had created before, I was able to create different heights on the shapes.
If you want to add some microsurface using grunge, you can, but I think it’s interesting to break the pattern according to the shapes. You can use the Vector Warp Grayscale. You have to add your Grunge Map and another map with some Color Information.
Using the Flood Fill, you can add the Flood Fill to the Random Color node which will "break" the Grunge Map as you want.
Since I already had a height map that is advanced, I could start adding some tiny details on the microsurface, like blending the Height Maps with some micro surface noise Grunge Maps, such as Directional Noise or Dirt.
Depending on which effect you want, you can use Substract, Multiply, or even Overlay. But be careful, because it would be really easy to get really noisy.
Using these blendings with a very subtle intensity, you can get nice microsurface details.
If you pay attention to the reference, there is a bit of tree bark protruding from each of the shapes. You can add this little detail by creating another Tile Sampler and using a pipeline close to the one we use for the main Height Map to have an interesting Grunge Map.
At this point, I already had a nice Height Map that worked pretty well. Usually, the Height Map is where I get most of the information for the other maps.
- In the case of the Normal Map, I always get it from the Height Map, so I get a good normal based directly on it, and if I change some data of the height, those changes are gonna be reflected on the normal map.
- I get the Ambient Occlusion from the Height Map as well, getting all the data from the flow of the graph.
- For the Roughness and Base Color, depending on what kind of material I am developing, I usually can use the Gradient Map node to remap my color palette based on the Grayscale Height Map I am using. If you are looking for a more organic style, maybe this option should fit you.
One of the interesting facts is that you can use a Gradient Picker to take a reference for a Color Palette using a picture. Usually, I take several tests on the picker to check different approaches on the color, to see which one fits me the best.
Having a first base color to start texturing, it is always good to use some Grunge Maps to add a little variation, or maybe use the same mask we use to generate some microsurface on our height, that way our base color will be based on the details that we generate within the displacement.
Step by step, I got a nice Base Color with the details that I already had. If your main objective is to keep a more realistic style or create PBR materials, you should try to keep your Base Color with no shadow information or colors. My aim was to get the pure color itself, without the details of lighting and shadows, so those ones were going to be generated in the engine in which I did my renders.
With the Roughness, I could have a similar process, trying to get the first pass with the Gradient Map, and later adding some details with some grunge – you may create it yourself or find inside SD, bring back the mask you used to add a little microsurface in the Height Map.
You can try to get some contrast in the Roughness to create a nice variation in the final render with the lighting, but remember to always try to get a correct finish. Usually, I add a little tweak at the end of the textures, maybe an HSL or AR level depending on the map, because depending on which software you use for rendering, you might have slight differences.
After all this, I had all my maps prepared for rendering. I already had my first bark material done, so I could go with the next one.
Set 2
So I finished my first set. For the second set, I tried to search for a different kind of sculpt in the height, something different so I could explore another workflow.
As I did with the previous material, my approach in the second set was to pay attention to the main basic shapes of the surface. Once I got that, I believe it was easier to tackle the rest of the details.
For the main shapes, I believe that the main detail is the cylinders that go all around the tree, so that is how I started. I thought it was important to have different widths in the cylinder, to give a better sensation of variation and an organic feeling.
I used a Tile Sampler with squares just to generate some vertical lines with different widths. It’s quite easy, because although the shapes might intersect with each other since I was going to add some color. Using the Random Color inside the Tile Sampler, I was able to generate a grayscale pattern.
The most important parameters inside the Tile Sampler would be these ones. Having the Distance node, mixed with the Edge Detect gave me Grayscale Mask based on these volumes. After this, using the Bevel node with plenty of smoothing, and adjusting with some levels gave me a nice smoother shape.
If you pay attention to the picture, there are some deeper volumes that go inside the tree, those holes are where the moss would appear more easily. To create that effect, I kept it simple, just another Tile Sampler with Polaroid as the main shape, adding some Random Position inside the Tile Sampler and some color variation. This allowed me to have that effect, and I had a good start for my texture.
Parallel to this, I started another pattern. This other grayscale pattern was meant to be more in charge of generating that crust that protrudes from the main cylinders, which forms a pattern that could resemble the previous texture, so the procedure is similar.
The procedure is quite simple – I used a Tile Sampler, using a circle as the main shape to scatter, with multiple widths, lengths, positions, and colors. I combined it with a Distance and an Edge Detect, had some Directional Warp to add detail, and finished with a Histogram Contrast to get white and black values (which is a good way to make sure that the Flood Fill works well).
It’s quite useful to combine the Distance node with several other maps. It can help if you want to avoid the black line between all the shapes, or maybe blend it with another map so that you have an intersection in some parts of the texture, while other parts don't have it.
Then I was going to generate several grayscale maps to add to our main Height Map flow, adding to the main sculpt, to have that extra crust that appears on the picture reference. Since these patterns were generated based on a Tile Sampler, it kind of "erased" the shapes I didn't want.
So, in the end, I had more or less a Height Map that had the main wood detail, with all the protruding crust, and even some fibers or microsurface already applied on the Height Map.
Another part of the graph is where I started my moss Height Map, which I later blended with a Height Blend node, in order to have the blending mask so that I could separate between the two materials (for different roughness, color, etc.)
The process in this case was really simple. First, I created a basic shape that I later used as my pattern input in the Tile Sampler. Although there are many ways for creating this, I used SVG for the creation of the shape. It's quite comfortable to make changes to the shape and see the results.
I kept it pretty simple, just blending with some nodes of clouds and adding some variation to the luminance of the general map. I would have moss with several heights, which I knew is gonna make a more interesting blending with the wood.
I had both Height Maps separated, and then the process was quite simple – I just had to use Height Blend to blend between them. I was using this node this time to have the power to create the mask separated from both Height Maps, so I was able to have different information for both surfaces.
The next step was just to create some Diffuse Map and Roughness Map for my material. The Normal and the AO were gotten directly from the Height Map. In this case, I used the same method as with the previous one – I used a Gradient Map node using the Height Ma as the input to get some color information.
The method was quite similar – just blending with some mask I used previously (to create microsurface, or from the moss, fibers, etc.). Blending between different grunges that I had also created interesting information for the Diffuse, with plenty of colors of variation inside, to give my texture a more polished quality.
Although I had to be careful in order not to get a too noisy diffuse, I saw plenty of references, and looked for some Megascans info, to get a better idea of how color works in nature where we always find plenty of colors, sometimes more obvious, sometimes more subtle.
Cheers! The second texture is done!
Set 3
Last but not least. Although this last texture set is a different type of wood, the process did not change that much. I was aware that the diffuse would be pretty different from the previous ones, and with some slight changes in the main Height Map, the perception would be quite different.
I started the same way, using a Tile Sampler to generate one of the main patterns, quite close to the pattern of the first texture.
In this case, I also added another Height Map to mix with the first one. I wanted to break a little bit the "perfect" cylinder shape of the FBX. I searched for several references or ideas that would inspire me. I created a "bumpy" Height Map that, with the right tweak, was able to create some nice volume depth that could make my texture more interesting.
As seen in the picture, I kept it simple, using a Tile Sampler with a Polaroid shape and mixing between different sizes to create an effect that would not feel artificial or random. The variation in size also added a lot to the texture.
As in both previous textures, I used a Flood Fill to generate several interesting grayscales to add information to my Height Map. Is cool to have several gradients based on our pattern, maybe grayscale to contrast the depth of the shapes in our pattern or even random color to break grunge maps according to my own unique pattern.
Also, in this set, I wanted to add a kind of white moss that can be seen in some trees. In several references I saw, I caught that detail, and I thought that it could be quite an interesting contrast in the color, and that could make the pattern more believable.
My objective was to create some little spots, which would appear on some parts of the bark, and later would make a big contrast in the color.
The moss would be placed over the bark in the Height Map, appearing on top. But I did not want to make it too obvious, because, in my perception of the references, the distance that the moss would "be" over the bark is not that big.
For the next steps, the process was quite similar. It probably included switching between other grunges or some different maps to generate the micro surface. I kept more or less the same method, applying some dirt maps for adding some microsurface, using my mask of the Flood Fill to create some interesting height variations based on my pattern, and beveling some of those shapes to have some interpolation when the pixels switch between black to white. Also, a big difference with the previous textures is that the Height Map was quite more contrasted, finding way more range between the darkest black and the lightest white.
And, using the same way, I generated Base Color and Roughness. From one map I obtained the other ones.
Following the flow and the hierarchy is quite important to keep it procedural. This way, any change that I did in previous nodes, such as changing the scale on some shapes, the number, rotation, mask, etc., the texture was updated automatically, affecting all the maps. This is quite powerful since I was able to make different variations of my texture in a fast way.
Using the previous mask, grunge, and gradients that I created with the Flood Fill, I step by step covered my texture with details that improved the quality of the Diffuse or the Roughness map.
With these last steps, the textures were finished. Unless you want to do some extra tweaks or start a new graph, the next process to do is rendering. For creating the renders of the models or textures, there is plenty of software that can be used.
In my case, for presenting textures, I like to use Marmoset Toolbag. Is quite manageable and easy to use, and you can get really nice results. If you want to render a full environment or use some kind of specific shaders, I recommend a more complete engine, such as Unreal or Unity.
Rendering
As I said, the next step was rendering which I did in Marmoset. My main objective for this project was to get close to some references I had. In order to achieve that, I looked closely at how the lighting was working inside the pictures, to get my lights in the same direction and intensity. I searched for some pictures that could be used as a background on Google, to help to get that "photo" quality.
It was really important that the lighting of the asset was working with the background, to make it all work together. If not, it would be pretty obvious that is a separate asset from the background, and it would lose all the feeling of being photographed. There are many ways of doing the lighting on the scene, I am gonna explain how I got mine.
Directional Light can give us the main source of light, most of the time representing the sun. In some renders (for example, I use a Sphere as the shape that uses the material), more than 1 Directional Light can be used. In this case, I only use one, and complement it with the Sky of Marmoset, searching for the right HDRI that would fit the colors I was looking for.
My main target was to be as close as I could get to the picture reference, so I wouldn’t have minded using more lights if this method got me closer to what I wanted. In case of illuminating full scenes in an Engine, such as Unreal, I would recommend better using only one.
Also, if we want to keep close colors to our reference, there is a tool inside Photoshop that can help us, called Match Color. Once I had the render done without this last process, I wasn’t still having the same sensation as the picture I used as my reference, so it was quite helpful.
Also, I used the Lens Blur to give all the focus to the asset with my material and help with the blend between the two elements.
With these lasts step, I was able to get the result I was looking for, to feel as if both pictures were taken at the same place.
Just with these little tweaks, the result can change quite a lot. In my case, I always add a little vignette for the final picture, which is a subtle detail but adds a little depth to the entire picture.
Also, as the last detail, I always duplicate the layer and do a Highpass Filter on the whole picture. If we put this new layer in Overlay and bring down the intensity of the layer, really subtle, we can intensify some interesting details.
So, in conclusion, for integrating our mesh with the tileable texture:
- Study the light of the background to know what lights to use;
- Use depth of field focus to simulate the effect of the focus of a camera;
- Match colors if needed;
- Search for HDRI that can help with the desired colors.
And voilà, using this method for the rest of the renders, adapting to the needs of the material, I got the following renders for another set of textures.
Conclusion
Working on personal projects is quite fun. I think it is a good way of practicing stuff. I believe the best is to look for something that can motivate you and encourage you to improve your skills. Home is where you can work on stuff that maybe you don’t have the time or the opportunities to work on while being at work.
Also trying to find something challenging is where probably all the artists feel more rewarded once the job is done.
I was very happy with the result of these, and still, I always think there is space for improvement.
I hope you find this breakdown interesting, and that you may learn something new from it! Thank you for your time!