Time for a complex one. Every environment artist needs a tree bark at some point. Cypress trees are iconic of Italian landscape, so it was fitting to construct a Cypress Wood Substance Material for my Rome: Fantasy Pack I project in Unity and Unreal. It turned out the heightmap came together pretty fast. Getting the albedo to look the way I wanted was the real challenge. Making sure the grey-to-reddish-to-tan transitioning felt right took some time.
My custom nodes, Get Slope and Height Selector, are required for this exercise. Get them here: https://share.allegorithmic.com/libraries/1172
The Height Selector isolates pixels in a greyscale heightmap based on their value. Useful for when you want to texture the “tops or bottoms” of a heightmap. The Get Slope node generates a slope texture where black pixels on the resulting greyscale map are considered flat planes and white pixels are considered vertical angles.
I actually didn’t finish a roughness pass on this one. I’ll add that in the future. Enjoy!
Reference. The bark has a number of key features that I noticed. There are several types of Cypress trees, but certain features I really wanted to capture into one type. The peeling was something I punted on as it requires some special time and attention.
We want to make the base gnarl map. To do it, we’re going to scatter the gnarly arms. Make a thin disc, bevel, and blur and adjust levels so it’s round enough.
For the wood surface, take a noise that’s not too noisy (clouds, creased, perlin) and use it with a Non Uniform Blur node. Use a noise that is lots of little pyramid shapes in the blur map slot. The parameters create a hard streakiness
Make 3 of those with pyramid noises of different sizes. The warps add an extra bit of fine wiggle. I blended the first two with Max(Lighten). The last with 60% Min(Darken).
We’re going to take our soft disc we made and blend it with 45 degree rotated versions of that streaky map. The goal here is to make 3 types of arms with different surface characteristics to scatter for variance. Auto level them.
Use each as a pattern input in a tile sampler node. Make them long, thin, with slight randomness in position and scale. Clone the node, but with twice as many arms. Then offset and Max(Lighten) the first set. Min(Darken) the second.
Use a Quantize Grayscale node. This essentially lowers the bit depth of the input, creating a “terraced” look. This helps make the layering we’re looking for. Use about about 8 samples. Max(Lighten) Blend that in 50% or so.
To do larger gnarling, warp the heightmap with a large, soft perlin noise zoom with a high intensity. Create subtle knots in the wood with a tile generator using only Gaussians. Warp with that, Blend Add it in only a little bit.
With Height, Normal, and Ambient Occlusion, you should have something like this.
For Albedo, make a giant mess with some streaking. That’s key for wood! I made a custom grunge generator that uses noise inputs, blends them silly, and out comes something crazy but nothing that looks “stock Substance Designer.”
Pick two base colors and just average them using that mess map. It’s important they’re subtley different though. Subtlety when making albedo textures is really important. Too much contrast and your brain doesn’t believe it.
Linear Grain is a node I made, but it’s like directional noise. Warp it with a large perlin and a smaller one. This recipe creates a simple wobbly wood grain
Subtract the wobbly grain from our subtle albedo. Clouds 2 made for a good blend mask jsut for variation. I also took a BnW Spots 2, sharpened it, and Blend AddSub 0.04 to add some very subtle but sharp noise.
With height selector nodes (from the project description), we’ll subtract different heights from our albedo to darken different “levels” or “terraces” from the wood. This emphasizes the layers.
Here’s where we get tricky. Take the slope of the wood heightmap between 80 and 45 degrees and subtract that from the highest half of the wood heightmap. A mask of the slopes of flatter areas in the upper half results! Then..
Use that slope map as a blend mask between our wood albedo and a reddish, darkened version. That’s our red cypress effect. Go back and play with the slope and height variables to get precisely what you want. It’s fine tweaking.
I took the albedo and used levels to give it more saturation and darkness. I took the highest areas of the heightfield, with a little fall off, and blended it in there. This is the wet underside of the grey skin on top of the wood.
Remember our mess map? Gradient map it with alot of gray tones. It looked like stone. Take the highest areas of the heightfield with a hard falloff, subtracted some grain, and that’s where the bark goes.
Make a curvature of the normal. Select differnent heights of that curvature, subtract and add those masks to the albedo to make variation in value, just like normal bark.
Take that stone mess map gradient map we did above and shift it to a subtle greenish moss tone. Again, grab some pixel vales at the top of the heightmap and blend the green in. Subtlety.
Lastly, get a very fine curvature of the normal map. Isolate the black and white pixels only and turn them all to white with a gradient map. Subtract a little bit for dark detail.