Ishan Verma did a breakdown of his procedural material Moroccan Painted Tiles created fully in Substance Designer.
In case you missed it
You might find these articles interesting
Hi, my name is Ishan Verma, I’m 22 years old, from India. I’ve been in the video games industry for about 2 years now, currently working as a Material Artist at Ubisoft India Studios.
Since childhood, I was very curious about how video games were developed and especially the art side of it. As I kept researching, I found that game environments interested me more, so I started learning about the environment creation process.
Looking at material work of senior artists like Daniel Thiger, I was really inspired and wanted to try creating one on my own. Thus my self-taught journey into Substance Designer began and every bit of it was exciting and fascinating. After some point, I completely focused on learning surfaces and texture art, every little trick and most minute details.
In 2018, I had a decent portfolio and was lucky enough to get a job at Ubisoft Mumbai.
Discovering Substance Designer
I have always been interested in learning new tools and workflows in the video games industry and trying them out with passion. Substance Designer had a different approach to material creation, its node-based, non-destructive procedural workflow really appealed to me, and I got very comfortable with it. Designer’s inbuilt renderers are amazing because I can see my step by step workflow in real-time and sometimes even render my final output.
During GDC 2016 when Naughty Dog talked about their Substance suit pipeline, I got amazed by it and jumped right into Substance Designer and aimed to learn every little tool it had to offer in-depth. With time, I started to realize the true potential of Designer and its ability to create a wide variety of materials right from tiling surfaces to technical atlases.
It’s been 5 years now I’ve been using Substance Designer for my professional and my personal work; and even today I feel like there’s a lot more to learn and experiment with. This kind of endless possibilities and learning is something I crave for and Substance Designer keeps quenching my thirst.
Moroccan Painted Tiles: Idea
After making a wide variety of Substance art, it was time I tried something new out of my comfort zone, something that has a lot of patterns. In this way, I can also learn procedural patterns creation using Substance Nodes and make myself a nice portfolio. So, for this, I chose Moroccan theme based on real-life Moroccan and Persian references. This substance “Painted Moroccan Tiles” is the concluding part of the series.
My goal for this material was to create some mesmerizing carved out patterns and designs on square tiles.
My plan is based on this process:
- Height Map generation – Breaking up all several forms and shapes and blending them to get a particular height data for height map generation.
- Normal Map generation – Getting a good normal map using a height map we created earlier.
- Base Roughness generation – Generating a base roughness map for checking for building a proper albedo, after that it gets pretty good to lookout for Roughness map refinements.
- Albedo generation – Generating Albedo is like getting a final pass of color values using all blend shapes and masks to give life to my materials.
- Roughness polishing – Then I use my albedo map, convert it to grayscale and try to mask out different masks for polishing my final roughness map.
- Final pass – In the final pass I focus on my graph cleanup as well optimizing it and polish remaining maps for better output.
- Marmoset Render and Preview – I do a base setup with lighting to preview out how material is looking, then get high quality renders and publish them.
Since I’ve done a lot of design-based tile materials, I faced a lot of challenges to make it optimized and give a realistic output. Mostly I want to replicate what I see in the exact real-life references. So, for Painted Moroccan tile material I started building up height data first as following:
Tiling Setup for Square Tiles (Height Data)
First, I started working on square tiles. For that, I used a tile generator node and created a base tiling setup of 6x6 squares. Then I used a bevel node to bevel out edges a bit. Now as per the reference, border tiles are equally divided into two halves. So, for achieving that I used a 2D transform node and a few blend nodes to divide the border tiles into two.
Now, for the edge treatment and damage, I used a slope blur grayscale with my height as input data. I also used noise nodes such as ‘Perlin Noise grayscale’, ‘Clouds 2’ and ‘Fractal Sum Base’ to treat tile edges for the edge damage. For that, I used various blend nodes and 2D transforms to add multi-layered damage to the tiles. After that I used a ‘Dilation and Erosion’ node to dilate out the distance between damaged tiles and using a blend node with a copy at 0.78, I blended it with the main tile setup to get edge damage.
For the surface treatment, I used a Fractal Sum base node and blended it on my main height using a blend node with a multiply blend mode. Then, I used an auto levels node to level out the noise data on the height and re blended it with ‘Fractal Sum base’ node again to get macro details on the tile surface. For micro details, I blended the same height map with a ‘Clouds 2’ node to get that bumpy effect on the tiles to give it surface volume.
For the directional gradient effect on tiles, I plugged my height map into ‘Flood Fill node’, used a ‘Flood Fill to gradients’ and made a random gradient tile setup. Then I blended that gradient setup on my main height data with a soft light blend at 0.52 value.
For the grout filling, I just Subtracted my main tile height map with the ‘Clouds 2’ and used a ‘levels node’ to level it out a bit. Then I used a height blend node to blend that subtracted data with my main heightmap to get that grout to fill in the crevices in between the tiles.
Extreme Surface Damage
For extreme damage like cracks and surface fall off, I used a flood fill node and plugged it into flood fill to gradient for getting multiple gradients. Then I blended 2 to 3 random gradients on each other using max darken blend mode to get slight fall off. Then I used some ‘gaussian spots’ node which gives a slight damage to fall off tiles.
Using the gradients as mask, I used a Crack Node (available on Substance Share), then blended it over the main height using subtraction with the mask I generated before.
Multi-Layered Pattern Structure
For the proper structure of the patterns, first I went through the real-life reference that I had taken to work from and did a breakdown of that image in Photoshop. For the breakdown, I just used a number of layers while giving masks to various patterns to get an idea of how designs are layered and sub layered on each other.
Then I used those masks as a block out to get proper procedural patterns inside Designer.
For the pattern creation, I used simple nodes called Shape, Polygon 2, and Uniform Color Grayscale as well as 2D transform and blend nodes.
I started the pattern from the center design. I used Shape node and various 2D transforms to get the basic mandala shape, then I used ‘Mirror Grayscale’ node to mirror my pattern out in all four directions to make it a flower-like design. Then on that pattern, I used a ‘Dilation node’ to dilate it out and blend it with the main mandala shape with Subtract mode. This gave a thick border for the design and center design with its border.
For the Ivy pattern, I used an SVG node to vector it out using a pen tool and went through the same steps as before with Mirror node. It gave me a designed climbing Ivy pattern in all 4 directions.
Using the same method, I started creating various kinds of abstract flower designs as per the reference. I used a shape node and various 2D transform and blend nodes to get the inner flower shape. For the petals, I did the same and also used a Circular Splatter node to splatter it around the center shape of the flower. Then I used a Slop blur grayscale node to give a paintbrush effect to the flower and then used a directional warp node to give a warped-out effect for making it look more realistic. Then for additional abstract design, I used a Reaction-Diffusion node and blurred it out! Then blended that abstract pattern with the main design to get an abstract feel to it.
I made 5 variations of the flowers using the same method, and for the tiling setup, I just duplicated the mirror node setup I had used in the graph before and splattered the main shape in all 4 directions using it. I used this mirror node method for all flower patterns I have worked on.
For the thin Ivy, I used a shape node with a circle shape in it, a smaller version of the same circle which I resized using 2D transform and blended it with a mail circle shape to get curved lines. I repeated the steps to get different sized lines and added them all using 2D transforms and various blend nodes.
For the leaves, I decided to make it as a small vector atlas in SVG node. I created around 10 different types of leaves using SVG node and then used that atlas with 2D transforms and blend nodes to splatter them on the thin Ivy.
At that moment I had all the shapes to create proper height data for the patterns. I used a Non-Uniform Blur node and my shapes as input to give them a bulge. I did the same with all the patterns and then duplicated the Edge/Surface Treatment process I did for square tiles to get details on these shapes.
Then for the actual carved detail, I tried to blend it with the square tile height using addition and subtraction blend modes, which gave the square tiles carved surface volume.
This is how I got my carved surface detail.
Then I plugged this height map into a Normal node and got my normal map. For the actual height map, I used the main height map as input on Anisotropic blur – it helps to remove ] all edge stretching and fractals faces by exceeding height limit – and then plugged it into the main height output node.
For the roughness setup, first I converted my normal map into curvature using Curvature Smooth node in grayscale and blended it over my curvature smooth map using min darken blend mode to get a suitable grungy roughness. I also used RGBA split with normal map to mask out a few values to get more out of the roughness map.
Then I used Histogram scan to scan out mask from Curvature smooth and then blended it with the main roughness to get variation in roughness map. In the end, I blended the surface damaged mask on top of the main roughness using Linear Dodge blend mode and yes, it is done!
Working on the Color Palette was always fun for me. For my material, I took multiple colors which I picked from the main reference, then blended them out with a curvature smooth using a gradient dynamic to get Analogous colors.
Then I used different shapes masks which I generated previously, used those masks with the colors setup, and blended one by one to get a proper albedo with a lot of color variation. For blending colors, I just visualize how the shapes in reference are placed on each other and using it as particular layering, I utilize blend nodes and masks to blend color outputs one by one using masks of that shape.
As the whole graph is procedural and contains several adjustable parameters, it's easy to change shape and color at any point.
Producing materials in Designer has always been fun to me and facing several challenges is a part of the whole process!
The most challenging part I faced while working on this material was breaking down all the shapes and how they were going to blend with each other for proper height, even the alignment phase where I had to blend different shapes took a lot of time.
Blending shapes and adding small components to the main albedo took a lot of tries and errors until I got the final output!
For setting up the final renders in Toolbag, I always use a sphere and a simple plane with 4K viewport resolution and put it to 2:1 scale.
For the lighting, I use a three-point light setup which consists of a fill light, a key light, and a backlight to give my material a realistic feel. This key light system always plays a vital role in achieving a realistic render so that every detail can pop out and material starts telling a story. I also use a bit of Global Illumination to give my material more life!
Getting a proper camera view needs a lot of tweaking with FOV. I mostly go for less than 30 degrees which almost covers up the material surface and gives quite good results to me. I also add a bit of sharpness and chromatic aberration effect.
Learnings Resources and Tips
- Gumroad, Artstation marketplace, 80 Level articles, and Youtube are full resources and content for learning.
- Dinusty Empire is another place to look for various tutorials about Substance Designer.
- Beginners can look at Substance Academy and Substance official Youtube channel for a proper introduction to the software.
- For intermediate and professional artists, you guys can hop on various Substance Series and Packs created by senior texture artists like Jonathan Benainous, Chris Hodgson, Rogelio Olguin, and Daniel Tiger, etc.
- Substance Designer is like a nodal version of ZBrush where you go from macro to micro process, just always keep that in mind and follow that method to work on your height accordingly.
- Whenever you start working on anything new, it gets tricky in the start but with time the whole process becomes much easier!
- Always keep a backup file and make your graphs optimized to avoid any crashes and file loss. For that, sub graphs are a better option.
- If the graph is big and heavy, always try to add a comment, pin, and frame to the nodal part so things can be found easily.
- For an optimized graph, try to make generators and nodes!
- Exposing parameters is another beneficial option to make it super procedural and tweakable.
- When you feel it's done, check it in different renderers like Iray, Toolbag or UE4, maybe test how it looks like in different lighting scenarios. It will give you an idea of what needs to be fixed.
- I’m planning to feature my material packs and tutorials soon on marketplaces, so please keep an eye on my Artstation profile to get updates in the near future.