Why Tree bark?
Every piece on my portfolio serves the purpose of me learning something new or showcasing a particular skill. I always want to try and push myself a little bit out of my comfort zone. I think natural materials like bark can be difficult to create well and something I’ve not had much practice at.
Since the shapes are very organic, you must push things for them to not look procedural. I wanted to achieve interesting, varied shapes which were super readable and had a level of stylization to them.
Since it would require a lot of shape experimentation, I decided to create this material purely in Substance 3D Designer.
I chose to render the material in Marmoset 4 as I wanted to practice using HDRIs and creating natural-looking renders in marmoset.
I usually collect references from real life, as well as my favourite interpretations of the look I’m going for. This gives me a good idea of the quality to aim for and the art style if I’m wanting to add some stylization.
There are usually bits I like from each reference I have, that I want to incorporate into my own work. In this case, I wanted to push some of the shapes, so I compared them to some more stylized references.
I also wanted to really make it feel chunky, as often in games trees can feel quite flat, so I exaggerated the shapes and that followed into the colour as well by using quite a wide colour range. The goal for me is always to make the most interesting-looking material and not necessarily just something that is completely true to life.
One thing I love to see in realistic materials is when a bit of stylization is squeezed in and you get really interesting ‘better than life’ results. Rather than aiming to make a copy of tree bark, I think it’s much better to combine all of your favourite parts from other artists’ work and from your real-life reference and then exaggerate and push things to look more interesting.
I think games such as God of War, Uncharted, Riders Republic etc have very realistic materials but they often feel quite chunky and readable with the height/normal map, the roughness is a bit more exaggerated and has a wider range than often in real life and the base colour can almost have a painterly or soft feel.
This hyperrealism and level of stylization that can be achieved in materials are what makes them stand out over a lot of scanned materials.
Default Graph Scale
The default graph scale is something I would recommend adding. You add an ‘Input Value’, right-click on the output, select ‘view in 3D view’ and select ‘Height scale.’ I wish I knew about this sooner myself.
This will mean whenever you reopen the graph it will use this as the scale for the heightmap. If you don’t do this, then every time you open the graph you will need to change the height scale yourself manually. This can be tedious if you’re jumping back and forth between graphs or working on material in short bursts over several days.
It also helps someone else look at your graph since it’s already displaying at the height scale the material was designed for, so they don’t have to try and figure it out.
Normal Map Strength
I usually increase my normal map strength; I typically use a value between 5 and 25 for the strength for most of my materials. Increasing this will make your normals read better since there are big changes in the height with this type of material, as well as subtle details, so you’ll need a bigger range. Don’t be afraid to increase it if you need to!
Tweaking and Exporting:
Custom Node – JT_Exporter
I created this exporting node which just essentially gives me the option to enable or disable maps. When tweaking the roughness, I often turn the base colour off, doing that in this node will set it to grey or black which can help me focus on the roughness without the distraction of colour.
I’m also able to disable the AO and other maps which makes it easier to make tweaks towards the end without having to keep unplugging nodes.
At the very end, I usually blur my heightmap slightly which prevents tearing, in most cases a value of 0.4 works well. This node packs the AO, Roughness, Metalic and Heightmap into one texture by default.
I could change this since there’s no metallic map for this material, so it could pack AO, R and H for example. In the near future, I’ll be making these nodes available for people to use for free on ArtStation.
Creating the heightmap:
Creating the initial bark shapes
I used an anisotropic noise to get the directional lines of the bark, I then used a quantized grayscale to control how many horizontal segments there should be. Then I created some paraboloids for the knots and warped the tree bark lines around the knots. Then I used an edge detection to get this result above.
This edge detection is important since you can then use this mask to utilize the flood fill nodes.
Next, I used the flood fill to random grayscale node into a distance to close the gaps of the edge detect and give me a random grayscale value for each individual piece of bark. This allows me to randomly offset any of my noise textures and effects later down the line to ensure variety per segment of bark.
From there I was able to use flood fill to random gradient to angle each separate piece of bark to be sticking out further at the bottom, but with a little bit of angle variation per segment so it feels less procedural. Then finally, I beveled my edge detection and blended it with my angle variation.
Here I am running a slope blur on a directional noise that has been directional warped using the flood fill to a random grayscale map from earlier that I ran a distance node on. This will give you varied warping per section of bark.
This helps to break up the silhouette of the edges, then I’m tightening the shapes back up by running a slope blur on itself, this breaks up the shapes and makes them feel more organic and varied and less procedural.
For the knots I used the cartesian to polar grayscale node on the bark heightmap, this gave me a super detailed wood end that matched with the shapes I was using in the main bark, just in a circular direction, then I used an RTAO node to push further indentations in and make the shapes a bit more readable.
To create the bark damage, I directional warped a directional grunge map using my flood fill to random grayscale that I ran a distance node on earlier. Then I used a levels node to get a mostly black and white mask of areas to add the damaged bark into.
For the chipped bark effect, I warped an anisotropic noise and used the quantize grayscale node to get a similar result to some of my reference, then I directional warped this as well to make it varied per segment of bark.
Custom Node – JT_Curvature
You’ll notice when working on the base colour that I used a JT_Curvature node several times. One thing I’ve started to do more of recently is creating nodes for simple things that I find myself doing all the time. In pretty much every material I have on my portfolio, I’ve used the curvature nodes and blended between a couple of them, then ran a histogram scan and blurred it slightly.
I then use this to highlight some of the edges and it usually makes the result pop a little more in the base colour. Rather than continuing to redo this every time I make a material, I’ve created this node which just gives me all the options I need for blending between the 3 different types of curvature nodes, running a histogram scan and blurring it.
I’d highly recommend creating your own little nodes like this to speed up your workflow, you’ll also be able to find this node on my ArtStation for free in the near future, along with any others in this article.
I’m using the ambient occlusion, curvature and normal map nodes to then run through a gradient map and colour pick from some of my references. I blend these on top and experiment a bit with the blend modes, to see what interesting results I can get. This acts as the base to then build on top of.
Next, I wanted to emphasize the lines in the cracks I’d created between the segments of bark, so I used a dirt node. The dirt and dust nodes are two nodes that usually help tie things together when you’re working on something organic. Using the ambient occlusion and curvature do the same as you’re using your existing shapes to vary up the colour.
I used the RT Shadows node to add some more bluey gray tones onto the front on the bark, this node is great for adding some directionality.
Then I added some variation to the colour based on the angle of the individual pieces of bark, you could also use the random grayscale node to do this, it’s just there for breaking up the variation per segment. I often use the random grayscale node to add variation in colour and roughness to my materials.
Then I used the dust node to tie it all together a little bit more. I added my fresh damaged bark effect afterward to make it feel a bit more recently exposed. I used the same mask as from the heightmap I created earlier and simply added to my existing base colour using this mask and uniform colour.
Finally, I used the curvature to highlight some of the edges and the AO to add some deeper dirt into some of the cracks, this is just to emphasize some of the shapes and make it readable in the base colour map alone.
This is something I tweaked when looking at my final renders because it just made the distinction between the shapes a little clearer and made it pop more.
The roughness of this material was very basic. Since I’d added so much variation from my height map, I was able to use this as a base and then just blend on each element such as my dust and dirt nodes to add some further variation.
I import my maps in, I plug the AO into the Occlusion and Cavity slots and usually have the value be somewhere between 25-50%.
Then I tweak the height scale. At this point, I usually have a lot of back and forth of tweaking values in my roughness and base colour, maybe something that was in substance isn’t as noticeable as I’d like, or some details are being lost.
I experiment with various lighting scenarios, times of day and more harsh or dramatic lighting, sometimes with a backdrop or without to find what I like. I knew I’d want a sphere render and a realistic shot of a tree which meant putting in a backdrop and playing with the depth of field.
I used https://polyhaven.com/ to find a HDRI that would work well for my backdrop.
The renders of the trees are simply using a cylinder which I added some noise modifiers onto in 3DS Max and pulled around a bit using soft selection. If this was for Unreal 5 then you could displace the model from the heightmap and convert it to nanite geometry. Or for another engine such as Unreal 4 or Unity, you could cut the tri count down as much as possible and LOD it.
I decided to use ray tracing with this render because it improved it slightly, however, the difference wasn’t huge, it mainly added a little bit more depth in the pitted areas on the tree in the foreground and gave me a little bit of warm bounce light on the tree in the background, but it was a very subtle difference.
I typically use a tiny bit of grain, sharpen and chromatic aberration. I play around with the focus and field of view depending on what I’m working on, for the shot of the trees I maxed out the far blur amount and increased the max bokeh size.
I render all my square images at 4096×4096, my horizontal ones at 2048×4096 and my vertical ones at 4096 x 2048. I find this makes it easy to showcase multiple material spheres or cylinders, as well as showcase the texture maps used as they’re already fitting the resolution of my final render, so I don’t have to do any manual scaling in photoshop of my renders.
I was happy with the final result, in particular, I enjoyed the process of making the base colour and also rendering this material. One of the things I’ve wanted to do more of is showing materials in context, having this style of render for the trees was a great way to do this. I’m planning to do a few other types of trees, to try and find new ways of achieving the shapes.
Each time I make a material I tend to improve on areas I wasn’t as happy with on the previous attempt of something similar, so in this case doing a few types of trees I expect them to only get better since this was my first attempt. I’m also going to continue creating custom nodes and in the near future, I plan to release all of them on ArtStation for free.
I hope you found this article helpful!
Feel free to contact me: