Joe Taylor has shown us the working process behind the eerie Catacomb material, explained how different maps were created, and why Unreal Engine 5 was chosen for this project.
Hi, I’m Joe Taylor and I’m an Environment Artist at Rebellion. I previously studied Games Design at The University of Huddersfield. I only started learning Substance Designer this year, after already being in the games industry. Previously I’d used Photoshop and Substance Painter to create materials for my environments, but it felt like the workflow was somewhat destructive. I wanted to learn Designer when I saw the quality of materials people were making and the power of being able to tweak parameters within procedural materials and see the material update.
Texturing had always been my favorite part of environment art, so once I got the quality of my Designer materials to a good place, I kept making more and trying to one-up myself each time. I became very interested in making more complex and believable materials and this is an area I’d like to continue to explore as I can see myself specializing in it in the future.
I was inspired by the Paris Catacombs and some materials I’d seen on ArtStation which were made by Arvin Villapando, Albert Soto, and Derk Elshof. I had a few main goals which I wanted to achieve with this material. I wanted to create a detailed Height Map with the minimal intersection between the bones. I wanted to achieve clean-looking shapes and a sense of depth and layering with the bones, which some of these artists had managed to achieve with theirs.
One thing which I wanted to bring to my material, which sets it apart from the others I came across, is the damage and breaking of the skulls which I found in some of my references. I then also wanted to experiment with presenting the material, making it look as realistic and detailed as possible within Marmoset and UE5. The UE5 early access had just been released that weekend so I built a small scene using Megascans along with my catacomb material to practice rendering it in the new version of Unreal.
I used skulls created by Distopia Interactive as a base and created an atlas in ZBrush which I baked to a plane. I created a few bones to match my reference and then rotated them to various angles so that I could have variety within the material.
I placed the skulls using a tile sampler and a simple mask to allow me to control where I wanted the rows of skulls to be within the material. Then I broke the skulls procedurally in Designer so it looks like you can see into the back of some of the skulls. One of the main benefits of the workflow I used was that I scattered and damaged all the bones in Designer which allows for an unlimited combination of levels of damage and distributions of the bones.
One of the difficulties with scattering the bones in Designer is avoiding intersection, especially since based on my reference I wanted them so close together, that many of the bones would be touching. The atlas scatter node really helped to avoid intersection. I layered multiple atlas scatter nodes with different bones at various angles to get a sense of structure and depth with the vertical bones.
I had already created large pieces of damage on the skulls but now I wanted to add some small cracks and make them feel natural. The main thing I wanted to achieve was to create a sense of structure to how the smaller cracks interact with the larger ones. I then masked the larger cracks onto the skulls which were broken to make sense visually, I also layered some smaller cracks onto a random selection of the skulls at a very low intensity.
For the dirt, one of the main visual goals was to make it feel varied throughout, thinking about micro and macro shapes to make sure the materials look good from any distance. One great way to achieve this is to use the fractal sum base node for the noise as you get access to min and max level values which allow you to dial in the micro and macro shapes.
Another important factor with the dirt is to make it feel like it interacts with the bones and is built up around them in a natural way. To achieve this, I used the Ambient Occlusion and Shadow nodes to get a few varied masks from the bones and added the result onto the overall height to create these varied pits which follow the flow of the bones.
Using Designer for this allows me to change the number of bones at any time and the dirt masks will update. It would be a huge pain if you had to manually sculpt the dirt shapes around the bones and then change your mind on the position or number of bones later down the line, keeping the material procedural in Designer helps to mitigate this.
For the base color, I wanted to create lots of variation between the bones but also keep it simple so that it’s very readable as a game material. I used the dirt and dust nodes in the end to tie the material together. The dust node is great for a material like this as it adds directionality by having dust gather on top of the skulls. Using the Shadows node to add dirt running underneath the bones also helped add some directionality.
In the past I would usually create various noises and use the Gradient Map and HSL nodes to create color variation and layer them onto the different skulls, isolating them using the flood fill to random grayscale and histogram select nodes. For this material, I changed out the use of Gradient Maps for Ben Wilsons' Color Variation node, which I came across on ArtStation. He created this node to help artists achieve subtle color variation from very few noises and single color inputs. I found this to be an interesting and more accurate way of creating the base color as you can update a single color input rather than relying on using Gradient Maps and HSL nodes. If you have scanned data you’d also be able to color pick these uniform colors, keeping them accurate for your reference.
Finally, I created the Roughness Map. I usually start the roughness by using the Height Map and dialling down the contrast with a histogram range. For the skulls, I was able to use the colour variation masks to have a lot of variety within the roughness. I generally add a subtle flood fill to random grayscale in my materials, so in this case, each bone has a very subtle variation in roughness. I then used a Directional Warp on some new noises to add extra detail to the Roughness and make sure it follows the shapes of the bones. It’s important to add as much detail into the Roughness as you can and add subtle variation that isn’t present in your other maps, so I usually create a couple of new combinations of noises specifically for the Roughness. I then layered on various masks such as the dirt and dust using the dedicated nodes, which help tie it all together. I adjusted the values of the bones and stones to be less rough so that they’d contrast more with the roughness of the dirt. This makes it more readable and provides more visual interest to the final renders.
When working in Substance Designer, I spend the largest amount of time creating my Height Map. This should be thought of as the sculpting or modeling stage, where you want to capture all the interesting visual shapes based on your reference, starting with macro and moving onto micro. The Normal and AO Maps can be created from your Height Map and will be the foundation of your material. You will use the noises and masks from your Height Map, Normal, and AO to help create your base color and roughness, so the rest of the process tends to go a lot faster.
One of the problems with a lot of beginner’s materials is that they look procedural and not natural, often this is because people layer things such as cracks and dirt directly onto their textures. Instead, you should use directional warps and masks derived from your heightmap so that details follow the flow of the shapes in the texture. One example of this would be cracks on tiles, you should separate the damage between the tiles so that it’s unique to each tile, rather than have the effect overlayed over the texture with cracks placed across separate tiles. All effects such as cracks should also be masked off parts of the textures to avoid repetition and create variation – the key to avoiding a procedural look is variation and subtle details. When you start to get more comfortable with Designer it’s important to think about the story of the materials and how they would be interacted with by people or affected by the environment they’re in. One example of this would be to place the larger cracks onto the broken skulls and only small cracks onto the unbroken skulls – this makes sense visually and helps to make it feel like the cracks have purpose and aren’t just randomly placed.
For people looking to learn Designer, I would recommend looking at tutorials and breakdowns by Joshua Lynch, Daniel Thiger, Javier Perez, Dannie Carlone, and Alex Beddows. I personally have learned most of my Designer fundamentals and ZBrush workflow knowledge from content by these artists, so I can’t recommend them enough.
Thank you for reading the article, I hope you've learned something from it. If you have any questions at all, feel free to message me on Twitter.
You may find these articles interesting