Rosen Kazlachev showed us how to create mortar-covered bricks in Substance Designer, discussed the workflow, and shared some advice on using the tool.
Hi! I'm Rosen Kazlachev, a Bulgarian Tech Artist. I mostly do different environment-related stuff. On top of the list – textures, and VFX! I've been getting more and more into the technical side of games, but it all started with simple 3D models and textures.
I've studied classical painting/drawing in school, later on, Graphic Design in University, and at some point, I started learning 3D on my own. I also graduated from the Advanced VFX program from CG Spectrum, which really pushed me into more technical things and using Houdini for pretty much anything except textures. That said, I started my career in the movie industry working on Hunter Killer and the Bollywood movie 2.0. Then, I got into GameDev and worked as a Texture/VFX artist on Phoenix Point, before coming to Creative Assembly Sofia to work on A Total War Saga: Troy.
I started learning Substance Designer four or five years ago. I was still getting into 3D then, so it wasn't only SD, but also ZBrush, 3ds Max, Maya, Houdini...pretty much all of it. Substance Academy wasn't a thing back then I think, so I was learning from whatever videos I could find and a lot on my own. Some 3 years ago I also picked up some math and got into the more technical side of Substance, editing nodes and creating my own.
I absolutely loved all the possibilities Substance Designer opened to new workflows. Re-using parts of graphs, easily blending materials, and simply getting a new texture just from changing seed values was amazing! As more people started using it, more materials were available and SD just kept getting better. I started doing some mini-tutorials on using the FX Map and Pixel Processor at some point, as those two nodes didn't have much information about them around the web. I like how SD pushed me forward both on the art side and the technical side of CG as well.
Mortar Covered Brick Project
My Mortar Covered Brick substance was a part of a 10-material brick drop I did for Gametextures.com. I had a brief about each material – a reference photo and some must-have parameters exposed. I was able to add more parameters to it if they made sense. Apart from the reference of each material I had my own board with different brick walls under different lighting conditions. if you're using references from online photos lighting matters a lot! Colors change a lot and you have to account for that when creating your Base Color. So, the goal was to create a brick wall covered with mortar with several exposed parameters, while the wall is never fully brick or fully mortar.
The substance has a few layers to it - bricks, grout, mortar, and paint on the bricks. And the mortar itself has its own two layers - top squared mortar and the destroyed part. To put it simply, this is how the layering works:
- Create the bricks.
- Create the grout and blend it with the bricks.
- Create the mortar top.
- Create the mortar 'damage' and blend them together.
- Then blend the mortar on top of the bricks+grout.
- And finally, layer the paint onto the bricks.
I think the concrete top/damaged blend was the trickiest part to get right, as to not have it look too soft with blurred masks and still get a bit of a soft transition in the lowest parts of it with the bricks.
Usually, I tend to use Gradient Map and pick my colors from the reference, but I had to expose the colors here. So that meant using Uniform Color instead. I really dislike giving the user HSL controls before the final color has been created, as things can go out of hand quite easily. Of course, user input should still be sensible even with Uniform Color exposed. One of the challenges was using only built-in Substance Designer nodes, as the end-user should be able to use the substance by default. Also, the substance should run under a certain MS threshold. That meant re-using as many nodes as possible to save performance.
I have the base colors for all layers separate, which are exposed as parameters. Then, I add some color variation to each layer on its own, and finally, I add more grunge on top of all of them. This way you get a more homogenized feel to your material. While working on the material I tried to stick as close to the initial reference as possible, keeping in mind that it should work with most colors. So if I'm doing a subtract/add/multiply on the base colors, I try to keep the values pretty close to the original. This is to prevent the substance from easily breaking when the user inputs another color.
The Roughness was quite simple, actually. It didn't have to be too complex, as all of the different layers' colors and details compensate for that. Still, there was some layering here as well - grout> bricks> concrete> paint, the paint being the glossiest of them all.
One of the biggest challenges was to create a realistic-looking brick. If you spend 10 minutes looking around for brick images... there are so many different kinds of bricks! I picked a few of them and tried to replicate that look. Also, mortar/concrete/grout differs a lot as well. Some are just splashed on top, some are evened and neat, some are, like in our case, in square shapes, but have a regular mortar underneath, some have missing spots... you get the idea.
The Multi-Directional Warp node does the heavy lifting for the damaged look. The mortar is blended with this cracked/distorted mask on top of the bricks. Perlin Noise gives some pretty smooth masks, which I tend to use a lot. But here I'm distorting it a lot and sharpening it with a high contrast Histogram Scan and then distorting it again to get better edges. Because the reference has those tile mortar blocks I also created a second mask, which comes from a Tile Sampler, where you pick tiles instead of Perlin Noise. After that, I subtract some parts of the Noise from the tile mask to get random damages on top of the tiles. Finally, I use that mask to blend between the top (small squares, clean) and middle (damaged, noisy) concrete layers.
The bricks part is not so interesting. I'm simply layering different noises, using masks for each noise. I start with some variation between the bricks, adding edge damages, layering the bigger broken parts around the edges, adding more big detail noise on top, and finally layering mid and low-frequency noise on top.
In the end, I had to expose some parameters and ended up with a bit more than I expected. But this gave some awesome controls and possible variations! Basically, the layering works like this – grout>bricks>paint>concrete, like in the Roughness. You can add more grout without affecting anything else, but if you add more mortar, you end up covering bricks/grout. Paint only affects bricks. There are controls for the brick count, 3 brick colours, grout/mortar colour, different grunge details intensities, mortar coverage, grout coverage, paint coverage and some more. The main thing with the parameters was that they should be in the 0-1 range, meaning 0 is minimum intensity and 1 is maximum. This makes the UX much better, instead of random value ranges.
One of the best things you can do if you want to advance your skills and create similar substances – experiment with the nodes! You can get some pretty cool results using the default noises in SD plugged into Multi-Directional Warp, Slope Blur, and Non-Uniform Directional Warp! Damaged natural forms, while they have some logic, are quite chaotic and random! Another great method to learn is studying others' graphs, followed by watching some tutorials. Substance Academy has some great stuff, as well as Experience Points, Daniel Thiger's Fundamentals series, or Substance Masters graphs. If you're looking for something more technical, I've got some stuff in my ArtStation blog and the Facebook group Inside the Node got quite popular recently.
Thanks for reading all of this and I hope it's been useful to you!