In the second year, I have the job of introducing the students to substance designer and during these classes I like to go through some easy node set ups to help avoid the standard beginner mistakes. These set ups were added because I was spotting the same problems from student to student, and actually, I’ve seen these same problems on websites like Polycount or Artstation where artists are experimenting with the program for the first time.
So this blog will simply go through a few of these tips which seemed the most helpful and may help others who are just starting out in Designer.
Disclaimer:these techniques are not unique or new (im sure many artists use these in their set ups) and I’ve almost definitely picked these up from other artists or articles over the years. This is intended for those who are just beginning to building their designer skill set.
Squashed bricks with the Tile Generator
When opening most .sbs (substance graph) files, you’re almost guaranteed to find a tile generator or tile sampler. These nodes are great for establishing a base pattern or repeating a design across your material while maintaining tiling. One issue with these nodes occur when building a “non-square” pattern, for example a brick, which needs to be rectangular.
You can see the issue is the width between the bricks! When we change the “X-Amount” and “Y-Amount” to different values, in this case X = 3 and Y = 10, the tile generator is simply squashing and stretching our pattern to a grid which matches these values. Using a histogram scan makes the issue more visible.
The pattern itself is also to blame, most beginners will use the brick pattern but importantly the pattern specific which adds a nice bevel or slope to the bricks, which results in uneven “grout” lines and also uneven bevels on the sides compared to the top.
An easy workaround is to change the pattern to a “square” instead, which turns the 2D view fully white, but if we also change the “Luminance Random” value up ,which will give each brick a different greyscale value, we should see our pattern again.
To create the grout lines, we can plug this into an “Edge Detect” node, which looks for changes in values and separates these by a sharp line, almost like creating little islands defined by the value of the input. The Edge Detect will keep the width the same and also makes for easy exposing later on (we could also round the corners here if we wanted).
To add a bevel or slope, we can blur the result and “multiply” the blurred brick with the original edge detect using a blend node. Now we have an even bevel around the bricks and also a strong, consistent grout line. A similar effect could be achieved with the bevel node as well.
Final comparison, on the left is our quick node set up, on the right, just the tile sampler output using the brick pattern. Note: You can use a levels node after the blur to make a deeper, darker bevel.
Breaking Up Continuous Patterns
When detailing your materials, you’ll be using a range of noises, patterns or textures to add surface details such as damage or wood grains. Sometimes we want to apply these patterns to planks or bricks or slabs. In this case, we would not want that pattern to perfectly continue from one plank to another, this would look un-natural. We’ll look at one easy technique to stop patterns flowing onto its neighbor.
Above is a very basic wood grain set up which is multiplied over a quick plank pattern, created using the same method discussed further up. This is the result
You can see that the wood grain pattern continues from one plank to another. In reality, these would be cut from different parts of the tree and so we would expect each plank to have a different pattern.
To break this pattern, we’ll first need a greyscale version of our plank pattern where each plank is a different value of grey. There’s a couple of ways to achieve this, for mine, I plugged the result of the edge detect into a “Flood Fill” node which then goes into a “Flood Fill to random grayscale”.
The Flood Fill nodes are a really power and convenient way to add gradients or random colours to each pattern. I would highly recommend going thorugh the documentation on these nodes, they can be really helpful. https://docs.substance3d.com/sddoc/flood-fill-166363369.html
We can use these random grey values as an intensity input for a “Directional Warp”. I’ve also plugged the wood grain into the first input for the Directional warp.
Setting the warp amount to a very high number, in my case 256, will result in a wood grain being split, based of our plank pattern. Moving the warp angle can help create a more interesting layout.
How does this work? If we think of our grey pattern as vales/numbers rather than colour, the map acts as a multiplayer for the directional warp. As each plank has a different number, the wood grain gets warped less or more than its neighbor and in this situation, “directional warp” is just a fancy word for move!
For example, if the plank appears as white (1) then its simply, 1*256( the warp amount) = move the pattern by 256. If the plank appears as 50% grey then its, 0.5 * 256 = move the pattern by 128 ect ect.
Final Comparison, on the left is the pattern applied to the planks without any warping, on the right is the warped result. This technique can be used for loads of different materials, bricks, marble, carpets, tiles, corrugated flooring ect.
One last quick tip! Blending two materials or height maps together can be tricky, especially if you want to colour the materials differently later on. Some artists still opt for the using a blend node , using the “Max (lighten)” blend mode. However theres another node which can be a real time saver!
The “Height Blend” node takes in two different height maps, a height map bottom and a height map top, and compares the values of both to determine which should be visible, it also has a slider that acts as a “levels” to edit the values of the height map top. You can also use a mask, however if you’re blending by height, this may not be necessary.
I’ve quickly thrown together two different height maps for this example. The height map bottom is just a perlin noise and some clouds, while the height map top, is just a tile generator with some luminance random.
By plugging in the height maps in their respective inputs, we can use the Height Blend’s “Height Offset” slider to control how far and how many of our squares punch through the ground noise.
This is great for blending height maps but its really helpful because it creates a mask for us to easily separate the different materials later on. You can see the node has two outputs, one for the height map and a second for a black and white mask.
I’ve taken this mask and plugged it into the opacity input for a blend node. This allows me to easily texture the squares a different colour from the ground and will automatically update whenever I feel like changing the height offset.
Hopefully these few tips might be helpful to students or artists just getting to grips with Designer. I’m sure there’s lots of different approaches to the problems I’ve shown above and other (much more skilled) artists will probably know better, more efficient workarounds but these are simply mine. For the sake of not making this a huge blog, I’ve left a few other tricks out which I may put together in a later blog if this goes down well.
Thanks for reading!
This is great! As someone just learning substance designer this has been very helpful. I would love to hear more about common mistakes that you see while teaching it.
Thank you! This is absolutely brilliant!