Hi Elliott, This is a great breakdown and very generous in sharing your process and insights, you came a long way from the vending machine days!
Are you planning on releasing the UE4 project to the public? Or only builds? I'd love to play around with it in the editor if possible!
3d material artist Chris Hodgson presented a lovely detailed breakdown of his material, produced in Substance Designer.
The goal when I began this project was to create a substance that incorporated vines or branching plant like growths completely within substance designer. I had been having ideas about how I would approach this kind of detail for a while and got to the point where I really needed to put it into practice to figure out if it was in fact possible. Ultimately I decided upon a Jungle themed rock face as it thought it would be an interesting substance to build even if the vines could not be achieved directly within designer.
When creating a Substance texture I always start with gathering reference. I’m sure people have heard this said countless times before but it’s hard to overstate just how important this step is.
I treat the reference gathering stage as a way to inspire myself and get excited about the texture I’m going to create. When I look at high quality, high resolution photo reference, I appreciate the contents for their form, colour, complexity and composition much like most artists look at a painting for the same qualities. Once you have an understanding for these elements in your reference, it becomes much easier to translate them into your substance. You also won’t be able to carry over every detail from your reference, it will take too long, your graph will become bloated and unmanageable and ultimately your texture will become too busy. Good reference will allow you to pick the details you will replicate in Substance Designer and the details you will leave behind.
For the Jungle Rock Face Substance I focused on getting good reference for the following details.
- Rock formations
- Large jungle leaves and plants
- Moss and small flowers
Once I had gathered my reference images I compile them into a mood board and sometimes set the image as my desktop image for the duration of the project. This way I get inspired and reminded of the task at hand every time I boot up my computer.
Setting up Substance Designer
When I create textures in Substance Designer I like to use the Metallic/Roughness template with an added output node for height. I find this to be easier to work with than Specular/Glossiness but it is really a matter of what engine you will use your Substances in. I exclusively present my Substances in Marmoset Toolbag and Unreal Engine.
For the jungle rock face Substance I started with an absolute output size of 2048px x 2048px. I begin at this resolution for almost all of my Substances because it gives me enough resolution to see large, medium and small details whilst I work but isn’t too costly on performance. I find that working in 4096px x 4096px can be a little too taxing on my computer and so I only render out my Substances at this higher resolution at the end of a project before I make my final images.
The format (bit depth) of the Substance is also an important performance consideration. It can be tempting to work in 16-bit for all of your nodes in the pursuit of the highest quality but I find it better to work in 8-bit until I start to see banding or artefacts in my normal maps and gradients. Only then will I switch the output format of the graph or offending nodes to 16-bit.
Substance Designer is an application that can take up a lot of screen space and so I would highly recommend at least a dual monitor setup to be able to work efficiently. I have the main Designer interface on one monitor and the 3D view taking up half of my second monitor. The other half of my second monitor is usually reserved for my reference images so I have access to all the important information without constantly switching applications or moving windows around.
My process for creating a substance nearly always follows the same pattern. I have decided on an order of operations if you will that makes it easier for me to create any substance in a predictable and manageable way. This involves tackling the various map types in a specific order.
- Firstly I begin with building the height information for the substance in a sequential manner whereby each visual component of the Substance (Rock, Vines, Leaves) is built separately and combined one after the other using blend nodes. In order to also see surface shading I make sure the height is converted to a normal map at the end of the graph. I only use a medium grey value for the base colour and the same for the roughness at this stage to not overcomplicate things.
- With my height and therefore my normal information at around 80% complete I will move onto creating the base colour. Having done most of the height information at this point will be helpful. I now have plenty of means to create colour details and the masks required to blend them using the previous stages of the height map.
- The third step is to move onto the roughness and this stage can usually be created quickly using a combination of elements from previous stages in the graph.
- The jungle rock face doesn’t include any metal components but creating the metalness map is so simple to produce that I create it whenever I feel the need to see that information, usually at the colour stage.
- At this point the Substance will really start to look and feel as intended but I will now spend quite some time moving back and forth through the graph reviewing and tweaking the material. I may add more elements to the material or remove some but I’m now trying to finalise each map to the highest quality before export.
Don’t rush into making your colour map, just stick with a grey colour value and concentrate on your normal and height map. Switch when you have most or all of your different elements present, starting your colour map too early is a mistake a lot of people make and it just overcomplicates your graph before it is really necessary.
Work on your large forms first, moving to more granular details as you go. Adding noisy details too early in your graph can destroy the impact and readability of your normal map very quickly.
Don’t feel like you have to build everything in Substance Designer. The software also works great when you import height maps created in any other software package, I often model or sculpt details in Maya or Zbrush, bake the height maps and bring that all into Substance Designer.
Keep your Substance graph organized.
This is usually something that is most important if someone else will also be working with your graph at some point, in a production scenario for instance. However I’d say that it’s really important to get into the habit of organizing your graphs for yourself. Having an organized graph will really help you out when you want to add or remove elements and it will also help if you need to extract chunks to be used in other graphs in the future. It also just makes it much easier to navigate and understand.
Creating The Height – The Rock Face
The initial rock height is created using a technique I use all the time when creating rocky substances. It involves multiplying gradients together to get a shard like shape that can then be scattered around using a tile sampler. The difference with this particular substance is that I created multiple shards that also contained crack details. This gave me more variety and allowed the cracks to more closely follow the formations of the rocks without a lot of warp nodes.
Once I have scattered the shards around I use the same height map to subtract details back from the height map. A histogram range node is useful here to modulate the depth at which the subtractive shapes cut into the rock face.
The type of rock face I was trying to achieve was deep within the jungle and therefore would have had plenty of water erosion on its surface due to the jungle climate. I use Non Uniform Blur with anisotropy and asymmetry at maximum with a downwards direction to move the shapes of the rock downwards. To add detail it was a matter of warping and slope blurring the eroded height map to until the shapes looked natural and pleasing in the 3D view.
Although I had already added some cracks in the initial stage I wanted to add some more complex crack like details. Here I hand crafted a single crack height map using a transformed Shape node set to Ridged Bell. I used Transformation 2D nodes to thin out and position the individual cracks into a branching pattern. Sometimes its useful to hand craft details like this in Substance Designer or bring them in from an external package. Trying to rely always on noises and grunges to create your details can be frustrating if you are trying to achieve a specific shape.
The cracks created in the previous stage were scattered using a Tile Generator and went through a series of warps and Non uniform blurs to add directionality to their height information. In the end these cracks added only a very subtle amount of detail to the rock and it probably could have been achieved more convincingly using fewer nodes.
This stage is a good example of how decisions you make earlier in your graph can almost be overwritten later in the graph and how it can be useful to review each stage of your graph for possible optimisations.
Here I add some smaller details to the rock face. BnW Spots 2 is a really useful node for small details and when used in conjunction with Directional Warp or my own Custom Multi Directional Warp node can create rally nice fine detail in your height map. In the same way Slope Blur can be used for a similar effect, just make sure you keep the nodes Samples high and the Intensity low.
I use Slope Blur combined with a vertical gradient to gravitate all the details in the map downwards. I also add some layered sediment detail to the rock surface using an intensely warped Clouds 2 to create a banding effect that looks like layers of rock conforming to the rocks surface.
To finish off the rock face I add in some vertically streaking detail that sits under the large forms already created. Most of this is achieved using Non Uniform Blurs with Anisotropy and Asymmetry enabled to push the shapes downwards. I also add some fine detail to the under hangs using Moisture Noise that gives a porous quality to rock like surfaces. When adding these smaller details I pretty much only look at the 3D view for updates, the subtlety of the details means that you really can’t see any changes in the height map in the 2D view.
Creating The Height – The Moss
The Dust node is used to mask the top surfaces of the rocks and create the base shape for the moss. The base shape is then modified using noises and slope blurs to add detail. Finally I use the moss base shape as a mask for a Tile Sampler that then scatters some simple moss leaves randomly across the surface.
Creating The Height – The Flowers
The height for the Flowers was created as a separate graph in order to compartmentalise the work and make it easier to manage. To create the small flowers I first began by creating a single leaf with a half bell shape transformed to make 4 leaves and combined together. I created 4 variations of the flowers by warping and rotating various elements in different directions. At the end I combine the 4 variations into a sprite sheet ready for importing into the main jungle rock face graph.
Once inside the main graph I perform a histogram range to make sure the tiny flowers weren’t too intense in the height map. I then extract and run each flower through a tile sampler. The tile sampler uses the moss mask from earlier in the graph to isolate the flowers above the moss. The tile sampler also uses a scale input texture to make the flowers slightly larger when they are near to the centre of a mass of moss.
Creating The Height – The Vines
The vines were the trickiest part of the graph to get right and therefore took the longest to define. I spent a lot of time tweaking this stage in order to find the best way to achieve the branching structure.
In order to get good variety I decided to make 4 lengths of vine using a gradient map with hand chosen black and white values. To get direction changes I used various warps at different scales. The problem was now that my vines had inconsistent widths on the bends and to get rid of this I transformed the vines by a tiny amount in the X direction and subtracted the result from the original. This gave me a thin 1 pixel vine that I could now bevel out from for a consistent thickness.
To create the branching structure I decided to use a hierarchy of tile sampler nodes in sequence. The previous tile sampler was used as a mask for the subsequent to limit the smaller vines to rendering when they were positioned directly on top of the previous larger vines. This was a computationally expensive process but with fine tweaking I managed to get an acceptable result.
Before each of the 4 vines could be used in this way they first had to have their origin placed at the centre of the image. I transformed them into place and this meant that when they would have the appearance of sprouting from the larger vines.
To add some final detail I use multi directional warp to warp the vines by some BnW Spots 1 and 2 and blend it with the original height of the vines.
Creating The Height – The Vine and Plant Leaves
As before I created the vines and the plant leaves in separate graphs for better organisation.
For the vine leaves I started with a ridged bell shape and subtracted two gradients to give the leaf some depth and shape. I then warp the leaf using a paraboloid for some perspective and symmetrise and recombine to get the three individual leaves. Lastly I warp the three leaves to get some undulation in the surface and warp again with the paraboloid to get some perspective.
For the plant leaves I created a spiral like pattern that could then be subtracted from a hand drawn leaf shape to give the grooves in the leaf surface. I also added a small stem using a warped shape and used gradients to add depth to the leaf. For variety I deformed the leaf in four different directions and then compiled them into a sprite sheet to be used in the main graph.
I use the external graphs created for the vine and plant leaves as nodes in the main substance and scatter them around using the vines as a mask to prevent them from appearing anywhere other than directly on top of the vines themselves.
Creating The Base Colour – The Rock
With the height map finished I move onto the base colour. With natural materials like rock, you can get realistic results very quickly by warping noises and patterns and then passing the result through a gradient map. I multi directional warp using the height as the intensity to distort some noise and this is passed through a gradient map containing sampled rock colours. This gives me a good base but I also want layers of sediment to conform to the shape of the rock shapes. This is achieved by warping a vertical gradient using the height and some noise as the intensity and angle. I also add some dirt on top and some moss on the bottom of the rock using the dust node.
Creating The Base Colour – The Moss
The moss base colour is really simple, I just just use a combination of curvature and noisy patterns to get a good greyscale map of different values. This is then just used as an input for multiple gradient maps and then combined together using a mask.
Creating The Base Colour – The Flowers
Creating The Base Colour – The Vines
I wanted the vines to have a different hue depending on which stage the vines were from in the height map. This adds an extra little bit of variety that helps the smaller vines stand out. For added detail I used some simple gradient maps blended in using the dust node.
Creating The Base Colour – The Vine and Plant Leaves
I use slope blur to push the values from the cells node down through the heightmap. This results in each leaf having a different overall tone to the leaves next to it and helps make each leaf stand out from the leaves that surround it.
Creating The Roughness
Creating the roughness was really simple. Using the masks for each component of the texture I blended uniform colours sequentially. The rock roughness was the only stage that was different as I wanted the rock surface to have some water streaks running down it. The water streaks were made by warping grunge map 6 to conform to the rocks and blending with a base rock roughness value.
Finishing and Final Touches
To finish the material I usually do some final tweaks including blending in curvature and AO into the roughness and base colour in very small amounts. I sometimes blur the height map and recombine with the non blurred version to soften the crevices in the height map. This can be helpful to reduce artefacts when using the height to displace meshes in Marmoset Toolbag or Unreal.
Recently I have started doing a final pass of optimisation when my substance material is complete. I refer to the guidelines laid out by Allegorithmic in the support documentation and this mainly includes reducing the sizes of nodes to their lowest acceptable resolution and disabling alpha blending in the blend nodes when not in use. I also take this time to make sure the graph is as organised as it can be using frames and a good layout.
Final Rendering and Presentation
I use Marmoset Toolbag to present my substances because I really like the quality of the renders, you can get really high quality reflections and the roughness detail really pops. The program is also just really simple to use and as a tool for presenting textures, it’s second to none.
The set up is really simple, I imported a slightly thickened double sided plane and apply the substance material, I always enable tessellation on the material because its a common enough feature in engines these days and it really helps define the material, especially when you get shadows being cast from the tessellated geometry. It is useful to have an air tight object with back faces to stop light bleeding through the back of the object.
To begin the lighting I just browse through all the sky presets to find one that compliments the colours in the substance the best. With some nice ambient lighting hitting the material I start to add and position lights to pick out the surface details and roughness variations.
When making the final render I try to find a flattering angle that shows off the texture at its best, usually I try to get an angle with good specular highlights to show off the normal and roughness map.
Before you do a final capture it’s good to go through the camera Lens and Post Effect settings to tweak the final look, I mainly focus on the tone mapping to get a good level of exposure in your final render. The final capture is usually done at double the resolution I want to ultimately present the image at so down sampling the image will give me some extra anti-aliasing and smooth any rough edges.
The substance was really fun to create and I learned a lot along the way. I hope you enjoyed this breakdown and if you’d like to see this substance material and more of my work you can see my work on ArtStation and purchase my Substance Material Collection on Gumroad.