Shray Khanna created a great tutorial, which shows how you can build a wonderful river bed material in Substance Designer. Check it out!
Hi, My name is Shray Khanna, I’m from India and I’ve been in games industry from past 11+ years and at present working in Dhruva Interactive as a Lead Environment Artist. I graduated with a Diploma in Animation and was lucky enough to get a Job in an Outsource Gaming company in 2006. Since then it had been a great journey of learning and learning and obviously working on some awesome games like PREY, Quantum Break and Forza Horizon 2 to name a few. Although I started working as a 3D generalist working on Vehicles, Weapons, Characters, and Environments, over the years I thoroughly enjoyed working on building worlds and photorealistic textures and hence moved ahead as an Environment Artist.
I had always been fascinated with new trends, techs, and software in our industry and always try to keep myself up to date with any ongoing updates that will eventually help me and make my team’s life easier. That was the first reason getting attracted towards Substance Designer back in 2015, it was the time I got to know about this beautiful piece of software where the work-flow was different than PS and ZBrush, it was a completely different approach for me as I never did work on anything nodal-based, apart from basic shaders in Unreal. But getting to know about it a little deeper gave me more and more reasons to learn it.
On top of my star feature list was its non-destructive nature and procedural control it gave any texture that I work on, being a person who loved creating environment textures, I found it a boon to be able to control the visuals on the go even after completing a texture without worrying about tweaking your sculpt and worrying about all the numerous changes on the slightest of the change in scope with traditional pipeline of generating textures earlier.
Here I’m gonna provide you with an as detailed as possible brief about my learnings and techniques I have specifically used while working on the latest material study of RiverStones bed.
First Things First – Idea
While deciding to work upon a material you obviously have to come up with an idea, it can either be a pure study or could be a part of any personal project, in my case, it was the latter. So I am working on as environment personally which was supposed to have a make-do pathway carved in these Rover stones, surrounded by a lake. So from this visualization comes my key goals for this texture, which were:
- Round shaped River stones boulders of varying sizes and color
- Muddy Swampy base due to the Lake around it
- Some water puddles in between the stones
- Small grown plants due to the weather conditions
- Some history/story details portraying this as a jungle environment by having some leaves, twigs etc.
Most Important part – References
If there is one thing I emphasize most on while working on any asset myself or guiding my team on anything that would be gathering and studying references. This step in any production pipeline is one of the most crucial steps of the entire process, as this gives a better understanding of the basic fundamentals of the material which I’m about to make. All these different references provide visuals and ideas about the features I had in my mind. All these different references allow me to further break down the forms and details for my texture which is the starting point of generating any material in SD. Another thing I do at this stage as well as to collect any remotely related artwork from Artstation where someone awesome had made something awesome already, and try and steal the features from itю
The second step is to create a mood-board of all these shortlisted images into one so that I won’t lose sight of my overall result and in one tab I keep shuffling through the standalone images while working on any specific feature, and one tab of artworks to get ideas and inspirations on the go.
Process I prefer
- Height Map generation – Breaking down each and every form (Stones of different sizes, Mud, Pebbles, Leaves, Plants, Twigs, Moss and water puddles) in different layers and then blending them together to a final composite height map.
- Normal Map generation – Which is basically a conversion of a good height map to normals and only sometimes adding some additional features on a need to be a basis.
- Base Roughness generation – Generating roughness at this stage actually helps in reading all of these different forms better, though it’s always good to leave it unfinished at this point.
- Albedo generation – Generating Albedo is pretty much like summing up the final output by providing enough color information in sync with all the other maps, required for all of the elements.
- Roughness refinements based on Albedo pass – Coming back to roughness by adding any additional details (if required) to support the Albedo map generated to keep the whole texture in Sync.
- Final polish pass – Fine tuning the textures to add that last finishing touch to showcase it well in Marmoset Toolbag.
- Marmoset preview – Setting up a base mesh previewer along with some decent lights to display the textures as they belong to an environment.
- Publish and Pray
Setting up the Height map – River Stones bed
As we all know that getting the right height map means 60% of the job done, so I start by breaking the most important forms first, in my case, it was the Boulders shape. So finally less of lecture and more of action!
So I recently learned few new techniques which I thought would be perfect for this particular form, Using Distance node on a random tile sampler to obtain irregular forms, then I used Edge detect to segregate those forms. The outcome generated from the edge detect nodes thus used in Flood fill which further provides gradient and random luminance outputs, which helps me define the angles and height variation of these big boulders. These outputs were then blended together with a Blur HQ to control the softness of boulder’s transition to ground.
Once I’m satisfied with the results I create a decent inverted mask and Normal map to be utilized in the next stage, which is the generation of medium-sized stones.
As the base shape, I generated in the last step had a lot of huge gaps in-between, I wanted to fill those with few more stones and also wanted to make them appear like overlapping onto each other. So I’ve used Tile sampler on some Warped round shapes, with Non-uniform Blurs applied to them to attain some quick boulder shape. The mask and normal map generated earlier were used as inputs Vector map Input, Mask map Input and Displacement map Input in the Tile sampler to help define the placement of these Large boulders within the gaps. To avoid the monotonous look I’ve warped and then Slope blurred the tile sampler output as well.
A result showing the merging of Base Forms + Large Stones using Height Blend node, as this node Blends any 2 outputs on the basis of their height information, and with just one simple slider we can control the overall depth of the secondary blend without being bothered about the unwanted clipping. This gives a more natural layering effect of Stones without even been working on a mask which I would otherwise do while using simple Blend.
Now I’ve gone ahead with some minute surface details like surface undulations via a very slight intensity of Slope blur, and some fine surface noise achieved using Multi-directional warp which was then blended at a lower opacity to have a subtle rough stone look. After that, I was looking for some surface layering of sorts for which Quantize Grayscale with a combination of Slope blur really do wonders.
As the negative space was still quite empty I’ve added 2 additional sets of medium to small sized stones to bring in variety and interest. Using the same technique I had used for creating Large Stones with. Although I could’ve tried getting different size stones via one single tile sampler itself but using different tile samplers gave me more control over the size and as well as the layering of different stones rather than being clipping into each other. And It was again blended using Height Blend node itself.
Setting up the Height map – Base (Mud, Pebbles, and Moss)
Getting the mud was a fairly straightforward task for me as it was the mere base of my texture which was only gonna provide a support, so I went ahead using 2 different scale cells as a base, and blended that with a Gaussian noise applied to a Slope blur to have enough wavy undulations on the surface. And also Blended a BnW Spots 2 to have granular information to the surface.
As I wanted the mud to appear like it’s crawling to the stone boulders from the bottom, the Height blend didn’t really give me the desired result and I had opted for traditional blending, opting for a custom mask to cater my requirement. I used the inverted mask of the Stones layer as a base and applied few Nondirectional Warps to achieve the results.
The final touch was to make the stone base appear lively and for that, I’ve added some small sized pebbles on the muddy base, created using the same technique via tile sampler. I did use my custom Stone form generator to have different types of stones in this one tile sampler. Pebbles were also blended with the base using Height blend giving me enough control to adjust their appearance on the basis of the mud undulation.
I was also looking for Moss shaping up from the muddy base and creeping on few of the boulders to add that organic swampy feel. For that, I generated a quick Normal to further generate other masks like curvature smooth, sobel and position, and for its height, I used curvature in a combination of BnW spots 2 to get the micro details of moss. I also generated a Dirt mask which is further utilized in the generation of the visibility mask for my moss, shown below.
For generating a good mask for my moss, I may have used a lot of nodes and I’m sure there will be a better and more efficient way to do it, but as my requirement was very specific to have it here and there on the muddy base as majority and only on very few of the boulders appearing very randomly to look natural but it should also look like creeping in from the bottom. Hence the simple Blend was required to blend it with my base height. To generate it I have used a combination of Slope blurs, Multi-directional warps and Non-directional warps with the generated Dirt mask and a regular Cells 2 node to get an interconnected yet natural occurring placement for moss.
Setting up the Height map – History/Story details (Leaves, Twigs, plants and water puddles)
For Leaves I used my custom leaf generator but this time I wanted more from it, as I was looking forward to having folded, half turned and deteriorated leaves, so I have used transform and Blend with a regular disc shape and faked shadows to achieve a folded leaf effect, which at that scale of leaves worked quite well. I had generated 4 different types of leaf shape to provide a good variation. And as I didn’t want any unnecessary overlap and culling between my leaves using the Tile sampler I had created RGBA merge layer to have these individual leaves with their respective alphas.
All of these individual leaves were then plugged into a Tile sampler Color, without the mask input this time as I wanted them to appear on Stones and as well as the base, showing their nature of regular falling irrespective of anything. To show deterioration I simply used Dirt 1 with a Transform to get desired scale and a Histogram Scan to further sharpen my negative and positive space, which was then blended with the leaves height map. To blend this I again used regular blend itself as the requirement was off to make them appear on top of everything else. And to have these take up the shape they have underneath, I used non-uniform blur on the base first with a mask of the generated leaves height to achieve a smooth undulation and then blend the generated leaves on top of this base with a mask generated using Histogram Scan.
The grown plant was generated using the exact same techniques shared above, even the blend has happened the exact same way, by only controlling the scale and placement using the Tile sampler.
For Twigs as well I had used my custom twigs shape generator which was plugged in a Tile sampler to provide a size and placement variation, and I had further added a Non-directional warp to bring in even more organic shape variation. And blend using Height blend so that it can be seen as halfway covered with Mud and overlaid small plants.
Now the final step for the height map was to have a believable water puddle to fill in the lowest of the crevices with a quick control, for this I utilized nodes like, Creased, Gaussian Noise, Grunge map 005 which first of all in itself gave a rippled appearance. I then used Multi-directional and Non-directional warps to have more of rippled layers, Which ran through a phase of Histogram Range in order to appear extremely subtle. After Blending a couple of these I got a fairly decent looking water puddle base. Blended with the base texture again using height Blend so as to provide a natural looking water puddles seeping through the lowest of the height range.
With this, I had concluded my height map as I was quite happy with the results and also so that I shouldn’t keep on going and going on refining it further and lose out on the bigger picture of completing this texture.
Normal map was then simply generated using Height to Normals with an apt intensity to bring out the best results.
Setting up the Roughness Base map
The motive for creating a base Roughness map was to provide a surface breakup between the different elements to attain better readability while working on the Albedo. So, in general, it was created using the masks for all the elements generated during the process of generating the Height map, with some noises applied to them and with correct range to differentiate. For few cases, this information itself was enough as a final Roughness pass. And for cases like Twigs and pebbles, only a quick base color information was good enough with their respective mask.
At this stage, I have a fair picture in my mind to have my stones with granular noise details, with them being slightly glossy, mud with a slightly glossy surface along with few dried areas. Moss being rougher than stones or mud. Fallen leaves were more of dried lifeless leaves and hence dull on roughness. And Grown plants being freshly and lively, appearing quite glossy. Water puddle obviously took the most glossy spot in this texture.
Setting up the Albedo map – River Stones bed
This for me personally is quite a difficult part of the entire texture generation process as the availability of an abundance of reference and keenness to push the visuals to as close as the real thing keeps me craving for more and more. At Albedo generation I generally spend quite a decent amount of time with quite a lot of iterations and quite a lot of times end up recreating the graph from scratch after reaching a certain stage if not really satisfied with the outcome.
Also to have better control on the final outcome generally at the mid-progress of generating my Albedo map I move to Marmoset Toolbag as I’ve seen a difference in visuals in between these Iray and Toolbag. So by moving to Toolbag at this stage, I work on the texture ensuring that my final outcome would be more compatible with Marmoset Toolbag.
The requirement I had from Albedo of these boulders is to have enough varied yet synced color palette and realistic surface details to hold up its integrity when seen up close.
So I had started with a decent looking Grunge Map 007 to capture enough color information via a Gradient Map using few various colored stones references, as this phase is pretty much a Hit and Trial one, I like to keep my options open and hence applied a Multi-Switch Node to have all of these different Gradient maps so that I can quickly switch and see the difference on the go. Another benefit of having that is that I could easily switch between different color pallets after even completing the Albedo map with just one simple control.
Post having these various color palettes I plugged them in a Gradient Dynamic along with a Flood fill to ‘Random’ to have a quick color variation just like that. I did plug an HSL node to tweak the values a bit. Then this base was further blended with some other color variation via a partial stones mask. I had further added some subtle surface noise details using some Grunge with Multi-directional Warps which was then blended with the Base stones pass. Finally, I had kept a Levels and HSL node to tweak the end result on the go.
For Medium sized stones I used the similar technique but in a much-simplified manner, and blend it with the surface noise already generated for the main boulders. It was blended using the masks generated from Height blend node. Albedo for Pebbles was also achieved using the same technique itself.
As I was looking for more specific freckle details as well as an overall dirt pass of some sorts on all of the stones, I have used Bnw 2 spots with really intense Histogram values to make it looks like a really fine noise and used it to blend a brighter and as well a darker range on my stone’s surface to give them a freckled appearance . To have a Dirt pass I used Cells 3 with a Histogram Scan plugged into a Multi-directional Warp to have a spread out dirt appearance. Getting these features in, kinda gave a confidence in my stones Albedo to stop it here and move ahead.
Setting up the Albedo map – Mud, Moss, Leaves, Plants, and Puddle
Albedo generation for Mud and Moss was fairly simple using basic grunge maps to generate gradients, then refining the HSL via the same node and blending them using the existing masks.
For Fallen Leaves and Grown plants the approach I used to get the color variation was to use a Cells 4 node as a base to control the color variation in the Gradient Dynamic node, then a Blur HQ applied to the outcome gave me a subtle hue variation within and as well amongst the leaves.
Albedo for Twigs and Puddle also were quite simple generations using basic Gradient maps blend with few overlayed details.
Setting up the Albedo map – Final Polish
To final polish the Albedo I have blended a Curvature map to get a subtle bit of height information, although to an extremely subtle value and then a Highpass Grayscale of the base to sharpen the fine details of the surface, again at an extremely low-value range.
With this last step, the Albedo generation was concluded with all the details looking specific to how I visualized it. As by now, the visual outcome was pretty clear in Marmoset Toolbag, I moved on to create a lighting setup and any final touch-up in the texture to fine tune it as per a realistic environment piece.
Setting up Marmoset Preview
Marmoset Toolbag is undoubtedly the best previewer which gives the user an immense control with such a simplified and easy to follow workflow to quickly go ahead with a setup and make it presentable as a real-time game art. But this stage does need some good considerations like how would you present your texture as a whole as this being the final step of displaying your hard earned work, doing this right or wrong can make or break the entire efforts. So do give this part a good thought and attention!
My process was fairly straightforward, First I quickly block down a mesh in Maya to how I want a quick and small scene to look like, in this particular case, I have added water as well using just an exaggerated version of my Water Puddle marks itself, and as that was pretty much a backdrop to showcase this texture it worked really well. Once I have the meshes in place I go around setting up the material with all my maps, and I enable tessellation control via material itself.
Then I start by switching the Sky Presets and check the outcome with all of these to finalize on the best looking one for obvious reasons :D. Once that is in place I go ahead with a basic lighting setup defining the main source of light throwing up shadows and some filler lights give a wholesome appearance.
Simultaneously while setting up the scene, I keep going back and forth for some fine tuning to the material in the Designer, things like fixing up the color values, some scale issues, roughness tweaks and surface details strength etc.
Once all of this is done finding the right angles is also very important as that allows me to finally flaunt my material the way I intended it to be, that enables me to showcase the right amount of roughness at a certain angle and the correct amount of height information, displaying the best of the features of my material.
Finally, a fair amount of post-processing in Photoshop allows me to do some final color, tonal and exposure tweaks based on the lighting.
Learnings & Tips
- You can find lots of learning resources on Youtube, 80lvl and Substance Source, made available by some very amazing artists, as your starting point when diving into Substance Designer.
- For intermediate, to professional learnings, you may check out the brilliant material packs made available by some of the masters like Daniel Thiger, Ben Wilson and Chris Hodgson to name a few. But obviously at a fair price available on Gumroad. – (2 questions I had been asked the most)
- Substance designer can be quite tricky at times, but the trick here is to take risks and explore as much as you can even if you don’t have a plausible explanation for doing something. You’ll be amazed by finding the results this way and that’s where the real learnings lie.
- Keep your graph optimized from the very start itself, procrastinate it will only make it worse, as after spending a couple of days on a material it might sometimes be very difficult to recall certain things in case you want to tweak something.
- Attain a habit of breaking down anything that you would want to make into Large, medium and small forms first, and then start breaking it back from the end result. The thought process should be to break it down to nodes in order to achieve a certain form.
- Create custom nodes for things you generally use in most of your textures, i.e. cracks, surface variation, leaves, twigs, stones etc. This will keep your graph small and healthy.
- Expose the parameters you would want to control the features of and name it properly, this way it will be extremely easy for you to make some changes extremely fast.
- Try to have a third person view from someone while working on anything, as then only you can have an unbiased feedback besides your own views, as we as human beings have a general tendency to like our stuff after looking at it for so long. In my case, it’s always my wife, to whom I can rely on for giving me a clear and unbiased view on how a certain thing should look like though sometimes annoying, but I am really glad for her having my back on this!
- I do have plans to release my materials as a pack and as individual as well on Gumroad soon, so please keep an eye on my Artstation profile to get updates in near future. (Another question I had been asked a lot)
This particular material was quite a challenging one for me but I’m glad I’ve made through and learned a lot in this entire process, I sincerely thank the entire community who share their knowledge and keep the learnings easier. And I perceive this as my way of giving back to our community. I hope you enjoy the breakdown of this material and learned a good thing or two. If you’d like to see some more of my Substance Designer work, you can check out my Artstation profile here.