Check out Simon Tremblay Gauthier talking about the way he designed a cool project, which allows generating pretty ground materials in Substance Designer.
This project actually originated from a more specific Substance Designer graph I was working on, a dirt road. While I was exposing parameters to make the dirt road customizable, I realized that by blending the different elements of the substance together in different ways, I could create a rather large amount of variety with this single graph. There came the idea to refactor the graph into a “ground generator”.
I added a few more elements and exposed additional parameters that would give me the control to create all the variations presets shown in the GIF.
All in all, this took about 4 days. The original road Substance took me around 2 days. Refactoring the graph and exposing all the parameters took about a day. I then spent another day working on setting up the presets, renders and presentation.
Original dirt road substance:
I always start with the height map and it’s also where I will spend most of my time. This is very important, attempting to jump into color and roughness maps too early while the height map isn’t completed is a recipe for disaster. If the height information isn’t correct, the normal and ambient occlusion will also look wrong and a whole bunch of issues will occur.
I analyze some reference images and try to identify all the different elements I will need to create. I then start building each element separately working my way from the biggest shapes to the smallest details in that order as much as possible. I try to make sure I account for all “level of details”: Large, medium and small shapes as well as surface detail. I won’t start working on other maps until I am satisfied with the height, normal and ambient occlusion.
One of the key challenges in this kind of material with a lot of different elements is figuring out how to blend all the different elements together. I had to think about the order in which the elements are gonna be blended one on top of the other. For example, in this material, it was interesting to blend in the rocks before the grass. This would give the grass some much-needed volume and would create an interesting effect as it overlayed on top of the rocks.
I used quite a few different techniques to create the various elements. Here are a few examples:
- For the rocks and pebbles, I mostly used the “flood fill” nodes to create the shapes:
Most of the smaller elements were created using this workflow:
- I would start by creating a few variations of a single element ( one blade of grass, one clover, one flower etc.. ) Using basic shapes, gradients, warps, blends etc..
- These would then be piped into a few “splatter circular” and/or a “tile sampler” to spread them around.
- I used the height of the underlying geometry in combination with random noise to create masks that would control where each element is spawned or not. The coverage could then be controlled by exposing the “mask map threshold” parameter in the tile sampler.
Here is the clovers height map generation portion of the graph as an example:
- This height information would then be blended on top of the underlying elements using a “non-uniform blur” followed by a “safe add” node (Safeadd node can be downloaded from Substance share) Using this node instead of a normal “blend” ensure that I won’t cap the values to pure white creating an unwanted flat surface when I start tweaking various parameters.
The full organized and commented graph SBS file is included in my Gumroad release.
This kind of style between realism and stylized is something I’ve been experimenting with. I don’t really have a personal preference for either style when it comes to games I play. I find each approach has its own merits and I have been trying to incorporate elements of both styles into my work.
The way I build my height & normal maps is a bit closer to realism with a lot more details than you would usually find in a stylized texture.
On the other hand, I will often go for an Albedo map that’s much closer to what you would find in a stylized texture. I use very bright and saturated colors blended together using simple gradients. I try to stay away from incorporating too much noise or grunge.
I let the height/normal information do most of the work when it comes to smaller shapes & surface details and intentionally omit to include these in the albedo. I find this can give a rather eye-catching look. The lack of noise in the albedo makes it easier to “read” the shapes and can provide some much needed “eye rest” in-between all those height/normal information details.
Since the material is composed of many different small elements that needed to be spread around, one of the nodes I used the most was the “Tile sampler”. While it’s a widely known and used node by everyone using Substance Designer, I feel some of its features are often underused.
- The ability to have multiple inputs is an easy way to create variety and avoid results that look obviously procedural. When a single input is used, the repetition is often very obvious.
- Using a mask map is a great way to control where the elements will be spawned. Although, I often see masks with values clamped to black and white used here. I prefer to input a gradient height map instead and control the coverage with the “mask map threshold” parameter in the tile sampler. This gives me more flexibility.
- The rotation map and vector map inputs are often overlooked but can yield very interesting effects. Using a normal map of the underlying elements as a vector map input, for example, can help to blend the various elements together more seamlessly for example.
Rocks and grass
This is a bit hard to explain but I’ll do my best:
- As mentioned earlier, the rocks were blended with the ground first, the grass was then added afterward.
- The rocks and pebbles were created in 5 different layers from big rocks to tiny pebbles. This gave me the ability to create separate masks for the different sizes of rocks.
- To create a nice layering effect between the rocks and grass, I found the best results were when the grass covered the smaller rocks fully giving the grass some volume but only overlapped the bigger rocks slightly.
- To create this effect, I created a mask to be used as a “mask input” for the grass tile sampler node. by subtracting the big rock from the underlying height map. This meant the grass would be allowed to spawn randomly everywhere but on top of the bigger rocks.
- Using “Pattern center” as a parameter for the Mask map inside the tile sampler means that although the grass sprouts won’t be allowed to spawn directly on top of the bigger rocks since they are masked, the height information will be allowed to overlap and won’t be “cut off”.
This kind of masking technique is why I find the “mask map input” of the tile sampler very powerful when compared to a simple blend that would “cut off” the height information.
The vines were one of those fun unexpected results you often get when working procedurally. I had set up a few parameters to control the size and warp intensity of some branches/twigs. While tweaking these parameters I accidentally ended with something resembling vines found in overgrown environments. I liked the effect and decided to push the idea further, creating a few more variations presets to include them.
I don’t know about a full environment, that really depends on the scope of it but the substance is quite versatile. Those 36 presets I provided were all created in the span of a few hours once all the parameters were set up. A simple drop-down menu allows to access those presets:
I left a few simple parameters accessible to the end user to tweak those presets:
Shall even more modifications be necessary, the full 150+ parameters that I used to create the presets can be accessed by using this “Dev mode” option.
These extra 150+ parameters allow for a ton of flexibility but they might not be as user-friendly… hence why they are hidden behind a “dev mode” but they are accessible nonetheless.
Are these materials game-ready?
I originally tweaked these materials for some beauty shots in Marmoset Toolbag but they should be pretty much “good to go” for any rendering engine that supports PBR and metalness/roughness workflow.
Some slight tweaks to the roughness map might be necessary depending on the rendering engine and lighting you are using. While doing test inside of Unreal I found the results were a little bit too glossy for some of my presets. A simple level to bring some roughness values a little bit closer to white did the trick.
Here are a few random screenshots of tests in Unreal. I’m using some of the presets that I modified slightly, blended together on a simple terrain:
The commented Substance Designer graph, the textures in 2048×2048 TGA format as well as the Marmoset scene used for the renders are all available for download on my Gumroad page.
I will eventually be updating this with a version that includes those slight tweaks and some new presets.
It was a pleasure to write this little article for 80.lv about this project! If you have some questions or want to reach out to me for whatever reason, you can contact on Artstation