Gustav Engman described in much detail how he approaches the production of natural procedural materials with Substance Designer.
My name is Gustav Engman and I’m an Environment Artist from Sweden, currently working at Starbreeze Studios on Payday 2.
It’s definitely something that has grown exponentially over the last couple of years after my introduction to Substance Designer. But I remember starting out with 3D art and immediately taking a liking to texturing. It’s such a powerful tool in our toolbox, similarly to lighting it can completely change the mood of a scene. It’s also a very efficient way to complement the story behind any environment, there’s so much a player can learn about an environment that has been textured with some love and thought behind it.
In the past it has been somewhat of a tedious process to create environmental textures, ranging from either photo sourcing to Zbrush sculpting (these are all very much valid by the way!), but with Substance Designer I can change my final result on the fly and be creative rather than spending time redoing steps that can take the fun out of it. This alone has elevated my passion for textures significantly, so much that it’s definitely the highlight of my day.
Gathering references is a good habit to get into, it makes your life much easier. It’s said again and again in these contexts but it can’t be overlooked. It allows you to get a good reference point for shapes and colors that you want to recreate in the texture. Luckily for my forest floor, I had the grounds outside my parents’ house to my full disposal when I was gathering references for that project. They live just by the forest and it was perfect for what I needed. You don’t necessarily need any fancy gear, a smartphone camera will do in most cases. Or if you can’t visit your parents, just go on Textures.com or Google…
Once I have the references I need, I use a Roughness/Metallic template in Substance Designer, and for personal projects I set the Size mode to Absolute since all I’m doing is exporting the texture maps for use in Marmoset Toolbag, CryEngine or Unreal Engine.
I like starting out with no specularity at all and just a small amount of AO because it is easier for me to read the shapes that way. Like most other artists using Substance Designer, I build my materials with height information as the main source for all the different maps.
The heightmap is converted to a normal map towards the end of the graph and the heightmap is also a good starting ground for the base color. I make sure to create masks for every height element in the graph which allows me to mask where I want the color to go for each specific element. The roughness is then mainly derived from the base color. Every element that I colorize is converted to grayscale, and using the same masks from each height element I blend together what ends up being the final roughness map.
Substance Designer can be a bit intimidating at first. Organizing my graphs helped me tremendously when I started out. I frame everything from the start in order to know exactly where I have each element that makes up the texture. It also makes it easier if you have to move sections of your graph around.
Another way I organize the graph is doing everything on a structured line. All height blends run down the middle of the graph, I blend together my base color at the top and then do roughness at the bottom. It makes it easier to make adjustments since I know exactly where everything is at any given time. Something that helps this step is that I build everything from bottom to top, meaning elements that would reasonably be at the bottom in real life is at the start of my graph. So in the forest floor, that means building the soil first, then roots, then stones, etc. This allows me to just keep adding stuff on top as I go, and it makes organizing easier.
I’ll use my forest floor as an example. Since I wanted to make everything in Designer, I knew the main challenges would be the pinecones and branches with needles. The pinecones because it’s a bit of a unique pattern and shape, and the branches because I had to mask out the needles from the wood.
Let me preface this with noting that there’s no right or wrong way to create your details in Substance Designer. Most of these shapes can possibly be achieved more efficiently or just built in a different way. That’s the beauty of Designer.
When starting the forest floor substance I had my doubts if I could achieve pinecones that looked realistic. However I quickly realized the pinecones don’t have to be perfect, the general shape and pattern of a pinecone was enough to sell the effect. So the graph setup is quite simple.
I’m starting out with a Polygon 2 node with 3 sides and with a curve to make a single scale that I later distribute using a Tile Sampler with a mask shaped as a pinecone. The Polygon is beveled to give it some volume. I’m using the Gradient Linear 1 to get a slope on the scale in order to make them stack similar to what they do in real life. Before I plug the shape into the Tile Sampler I transform it slightly to make it more centered in the canvas.
In order to make the pinecone mask I’m using two different Shape nodes, one is the Ridged Bell and the other is a Disc. I histogram scan the Ridged Bell and then I transform the two shapes together until it roughly resembles the silhouette of a pinecone. The mask is controlling where the pattern is spawned.
Once the shape is distributed I’m first blending together a blurred version of the mask with another version of the mask that has the Gradient Linear 2 multiplied over it.
In turn this is then multiplied over the pattern I got from the Tile Sampler. This gives me this result.
Then I Directional Warp it slightly with a Paraboloid to give the illusion of roundness.
Unfortunately, I wasn’t completely sold yet. I felt like it needed something at the bottom of the of the pinecone, a peduncle (yes I had to google that). With some experimentation I found that using a second Tile Sampler with a lower X and Y number together with the Cartesian to Polar node created something that could work as a start:
Then I transformed that into place at the bottom of the pinecone, and finally finished it off with the peduncle itself, made using a slightly directional warped square Shape.
I sloped blurred it a small amount to get some surface variation. Here’s the final pinecone shape that I plugged into the Tile Sampler to scatter around. Since they are so small it looked convincing enough.
In hindsight, the branches were the most difficult to get right, and I’m still far from convinced I ended up with the most efficient way to do them. In production I would definitely not do this in Substance Designer, but rather bake the height from a high poly model and bring that in. But it was a fun challenge nonetheless.
Originally I made one straight twig shape, and scattered my needles over it, and then transformed several smaller versions of that into something that looked like a branch. That gave me two problems – 1) It was difficult to mask the wood from the needles and 2) the needles on the smaller twigs branching off from the main twig became too small whereas they should be the same size for most of the entire branch. Simply put, it was easy to spot that I just transformed one twig and just made it smaller. The scale felt off.
To solve the first issue, I realized I had to scatter the needles and twigs separately before I blended them together.
To solve the second one, I ended up making a Tile Sampler with 3 different sized twigs. One small, one medium and one large, main twig. The Gradient Linear 1 is plugged into the Scale Map input and using the corresponding slider in the Tile Sampler node I can easily control the size variation between them.
From that, I separate and transform each of them to the center of the canvas in order to get 3 different sizes to work with. Then I histogram scan them to use as a mask for the needle distribution similar to how I did the pinecone. I proceed to add Slope Blurs and surface noise, which in hindsight I could have done earlier in the graph to avoid doing them separately.
Using the mask for each size variation of the twigs, I scattered the needles with 3 separate Tile Samplers. This gave me 3 variations of the needles, the image here is a composite of all 3. Each of them are separate in the graph to transform as I please.
The gradual size reduction of the needles from the bottom to top was achieved with a gradient multiplied over each twig and then plugged into the Scale map input of each Tile Sampler node. I use a shape to subtract over the original mask in order to control where the needles start growing on the twig.
Next up is the most tedious and inconvenient part. I transform the 3 different twigs into something that looks like a branch, and using a copy each transform node I move the needles into the same position.
After that I warp both Step 1 and 2 with directional warps using the same settings, just to get something that isn’t completely straight. The final step is to scatter both of these images with two different Tile Samplers using the same settings as well. This ensures they sit at the same exact place. I recommend exposing some properties in these Tile Samplers to make this easier to manage. Once they are both scattered I blend the needles together with the twigs, before I finally add them to the rest of the height map.
The final branches blended in with the rest of the heightmap:
I use a technique that was figured out by one of my co-workers, Douglas Holfve (check out this ArtStation here)
This changed the way I layered elements on top of each other. It’s really simple but makes an incredible difference, and allows you to blend shapes with little to no noise (i.e leaves) easily on top of more noisier surfaces (i.e moss). Here’s how you do it.
First, histogram scan the height information that you want to blend over your heightmap, in this case I use my leaf clusters.
This gives you a mask that you plug into the Blur map input of a Non-Uniform Blur node. In the Grayscale input, plug in the height you want to blend your height info with.
The Non-Uniform Blur will blur your grayscale input only where the mask is white. This gives you smooth spots on the heightmap that is much better for blending in new elements. Then I just proceed to blend in the height information with the heightmap using the Height Blend node (Fig_17).
I can only speak for myself here. PBR gives you a more coherent look to any environment, but it’s not a magic solution to good looking games. For games that aim to simulate materials and environments as realistically as possible, PBR is the way to go nowadays. It also makes more sense for artists once you get into the habit of working with PBR shaders, because since you are using real-world measured values, you can expect real-world results, whereas traditional shaders could look good in one lighting scenario, but awful in another.
At the same time, it’s art that we are dealing with, some leeway is probably always required to get the result you want. It doesn’t have to be strictly anything when it comes to art, a middle ground is often the best way to go.
As for procedurally generated content and photoscanning, once you have your preferred pipeline it’s good to stick to it and not blend between procedural textures and Megascans, for instance. But both ways are perfectly valid workflows that can deliver some amazing results as we can see with Naughty Dog’s Uncharted 4 (mostly procedurally generated) and DICE’s Battlefield 1 (photo scanning). Mixing the two however will probably give you very inconsistent results unless you are careful.
Three things mainly – First, study and pay attention to the world around you. Take photos when you’re out for a walk or just when you find a material that could be fun to recreate. Analyze what makes a real life material intriguing or interesting to look at. Break down the texture into smaller components that you can try to recreate in your application of choice. For my forest ground I broke it down into a few easily manageable categories that helped me stay focused:
Second, look at other artists around you. Look at their work and break down what makes it awesome, or less awesome if that’s the case. Start small and work your way to the point where you can start comparing your work to people who work in the industry.
Third, don’t reinvent the wheel with everything you do. Experimenting is great but if someone is openly sharing a technique, feel free to use it in your own projects if it helps you out – as long as you give credit where it’s due. In a production environment you’re just wasting time otherwise. Those are the main things I can think of. Good luck!