Mark Foreman from CD Project RED talked about the way you can approach the creation of complex procedural materials.
Hello! I’m Mark, I’ve been making game art for a little over 10 years now and I’m currently working as a Senior Environment Artist at CD PROJEKT RED. I started out in the modding community, primarily of Half-Life 2 where I contribute to the Half-life 1 remake Black Mesa with the Crowbar Collective. Education wise I studied Computer Games Technology at the University of Portsmouth for 3 years and graduated in 2011. After which I had an 11 month internship with Lionhead in the UK, before moving to Poland at the beginning of 2013 to start at CD PROJEKT RED.
Substance Designer is an application that lets you essentially magic any material you want out of thin air in the form of a Substance. You are only really limited by your imagination. You construct Substances out of nodes in Substance Designer, shape generators form a base which you can then adapt and layer with warps, noises and more smaller shapes which are in turn layered themselves. After all of this you can output any maps you may desire or some game engines allow you to import substances directly giving you extra flexibility for your games materials.
This is the node graph for my Jungle Rock Face Substance for example:
The biggest and best difference between creating a Substance over simple photo-sourced or mesh baked textures for me is the flexibility you have to modify and adapt. For example, you have a brick wall material that you are very happy with, but now you want a version with 10 rows of bricks instead of 7 and maybe even a few bricks missing. If you had been working with photographs, adding those 3 extra rows of bricks was going to take you an hour or so of cutting and pasting, cloning and scaling or whatever, until you had what you wanted. And you’d have to do this for all parts of your material individually, albedo, normal, roughness, etc. With a Substance that change is as straightforward as swapping a value in a box from 7 to 10. Seconds of work, and completely non-destructive.
Here’s a couple of the possible variations I can get in my cliff Substance by altering nothing but few nodes that make up the large shapes in the input heightmap.
Another great thing is once you have got a substance you are happy with, such as a plain concrete, you have a starting point to use whenever you want to make a new concrete surface. You can use that substance as a seed, instead of having to create a concrete from scratch each time. By changing a few parameters and layering some extra details you can make your new material in half the time of the original Substance.
Could you talk about the way you’ve approach the production and planning of this material? How many layers and elements do you have here?
The plan was very simple at the beginning. One of the first substances I finished after learning Substance Designer was another rock substance. Though happy with it, there was obviously room for improvement, so that’s what I was setting out to achieve when I started on this project. A new, better rock substance. Something to have as a base to revisit whenever I want a new rock material for any future projects.
I started by gathering some references. I picked limestone as my inspiration, I thought the forms you see in the references I was finding would pose an interesting challenge. The first thing I did was create a simple block shape to use with tile samples to build up the large sedimentary layers. Next I added some scattered lines in horizontal and vertical patterns that would become my cracks and striations. The final part of the base rock shape was to add some wedge shapes on-top to form the overhangs in the geology.
Now that the structure of the cliff is formed I added a number of smaller details such as erosion from water running down the surface and damage in places where the surface has fractured and crumbled away. The last layer of detail was to add a number of layers of fine surface noise such as pockmarks, smaller cracks and sediment grain. For the cliff itself the final step was to add some large soft forms to push the height of the cliff shape around.
At a point where I was reasonably happy with my cliff I decided to add some moss as that was a detail in a lot in my reference images. For the first pass I just cut and pasted some moss from an older substance blended it in and called it a day.
Following some feedback from a friend however, I decided this was a bit too flat and boring so I went back to the drawing board and created a whole new moss substance to use with this cliff. This time I focussed more on creating unique plants and leaves with a lot more depth. This little push really helped take the whole thing that extra mile.
I like to get some colours going early on in the process to work towards what will become my final albedo. I find it helps my process as a whole if I can get it heading in the direction of my reference or desired result as early as possible. It is at the end though where I really focus on this part of the material. I use gradient maps in various ways to take colour from the heightmap as a base. Then I layer extra colour from noises on top of this base. The final thing I do is create my roughness and specular. As I felt the addition of the foliage had pushed it in a more tropical direction, I added some water streams running down the surface of the rock to hint at humidity.
What are the main parameters that you have to manipulate to get this fantastic rock texture? I’m interested in the way you’re building all those incredible cracks and protrusions.
I’m really pleased you appreciate the shapes. Getting that sculpted look was my main objective when starting this piece. Sculpting a rock heightmap in another program, and then importing this to use as a base in Substance Designer to create your albedo and other maps is a very valid process and you can get great results that way, but adjusting your input sculpt can be time consuming down the road if you want a different shape. For me I wanted to keep the flexibility that a procedural pipeline gives you, without sacrificing the result.
As I covered above, I started with some tiled blocky shapes and layered over this some larger curvy forms to create the core shape of the cliff. For the cracks I scattered some lines which I then directionally warped so they followed the shapes in the base cliff face. Here though, instead of just multiplying my cracks over the base shape I blurred them and used them as the input to a slope blur greyscale which has the effect of pinching the heightmap towards the low points.
With an Edge Detect node I was able to isolate the sharpest edges in my heightmap and it was these that I then multiplied back onto the base as the cracks.
Using the slope blur greyscale with the edge detect node meant that if there was not a sharp enough transition in the heightmap, that area was not turned into a crack, but in the final piece there is still an indentation there. This was one thing I found that really helped getting the organic feel I wanted. It injected a little bit of chaos, which when working on something natural is often a great thing to embrace, the results suffer if everything looks too calculated.
What’s the secret behind the moss and other elements on top of the rocks? How did you build them? How did you let the two fit so naturally together?
This was one of the bigger challenges I faced, and one I am not certain I really beat in the best way. I wanted to add the moss as evenly as possible across the surface of the cliff. But as the cliff has a lot of depth in the heightmap a simple mask either meant I was left with just some rocky peaks poking out above a sea of moss. Or moss that was barely visible, constrained to the very depths of the cracks and recesses.
I ended up adding a couple of different layers to darken or brighten the moss to counteract this. Firstly I isolated the lowest values of the cliff and multiplied this over the moss. That helped bring the moss from a mid point back down into the recess. By controlling the strength of this blend I could raise or lower it. I then also wanted to bring the moss up to fill the cracks of the peaks in the heightmap, but without covering the surface to completely. I used a high-pass filter to isolate the recess across the whole heightmap and then used that to create a mask to brighten these parts of the foliage before the final blend with the cliff.
What about the randomization?
I think the best thing you can do is add as much variation to your individual parts as possible. Generally speaking I warp or mask nearly everything I add. I very rarely take a noise or shape and use it without personalising it in some way, big or small. If I’m adding a layer, I always make sure it reacts to the layers beneath, by warping it with the previous height or masking it, for example to limit it to the highs or lows of the underlying heightmap. This helps everything feel connected, and can help prevent things like cracks from looking like they are floating on the surface.
When I’m adding my surface noises I try and add each particular detail to no more than sixty percent of the final surface. For me having detail that is evenly distributed over your whole substance is one of the things that can quickly make a material stand out as generated. So I break up each of my my detail layers with simple masks. This way if you have 3 or 4 different detail layers you will still cover the whole surface with something interesting, without every square inch being detailed the same.
Tips and Tricks
One thing I ended up making use of a lot when it came time to detail the surface of my cliff, was parsing a noise through a slope blur greyscale node with a blurred version of itself in the height input. The slope blur greyscale node directionally blurs your input along a slope from high to low, based on an input height map. So when you use the same node for both the input and blur it for the height input also you can get some nice erosion lines for example if you are using a fractal noise node as a source input. I also used this with a cells 2 to form the base of my fine cracks as it pinches the cells 2 node in a very organic way which I found worked well for the cracks I’d seen in my references.
Is Substance Designer complicated?
When you first look at what people are making, and then you see the sprawling graphs behind their work, it can indeed be pretty daunting. The best thing you can do is just jump in and start experimenting though. Once you start working with it, and you are down on a node to node scale it very quickly makes sense, especially as every change that you make you get to see updated in your outputs in real time. There is a very healthy online community grown around Substance Designer which is very supportive of people interested in learning. Then Allegorithmic themselves and others have some great tutorial videos online to help you get started.
A key thing is to keep experimenting. Even if you’ve found one way to get a result you like, don’t be afraid to try and tackle it a completely different way the next time. It just might turn out better.