Geometric Patterns and Ornamental Art with Ishan Verma

  • Game
  • Interview


Hello, my name is Ishan Verma. I’ve been working as a material artist at Ubisoft India Studios for about 2 years now. I specialize in realistic textures and material creation for AAA games. 

I like to explore the surfaces and environments around me; these always inspire me to create such materials and textures. 

I’m 22 years old now, and I’ve just started my career as a material artist at Ubisoft, and this is my first job. Curiosity led me into researching how 3D environments are made for games. Thus began my self-taught journey into 3D art and Material creation. 

Check out which of Ishan’s materials made it to number 10 in the 2019 Substance Designer Insanity Awards!

Ubisoft Mumbai 

At Ubisoft Mumbai I’m working on the recently announced Prince of Persia: The Sands of Time Remake, which is India’s first AAA title. 

I’ve been honored to work alongside some of the most talented game developers in Ubisoft India and a big part of my job is to create a variety of high-quality textures and materials to be used in the game. 

Substance Designer

I’ve always been interested in learning new tools and workflows in the video games industry, and passionate about trying them out. 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. Substance Designer’s in-built renderers are amazing because I can see my step-by-step workflow in real-time, and sometimes even render my final output. 

Since I started using Substance Designer, I’ve always tried to push the limits of the program by creating challenging pieces of art. I use these projects as sources for my personal learning. 

Substance Designer does most of my work, but occasionally I use Photoshop or ZBrush for creating custom masks and minor tweaking if necessary. For instant variations Substance Alchemist becomes handy. In addition, Substance Painter plays a vital role in creating custom hand-painted textures and then importing them back to the Designer’s graph for custom usage. 

(I use my Substance Designer smart materials in Substance Painter to texture my models). 

Inspirations and style

My inspirations come from various storytelling sources, whether this be in real life or the digital world; I get influenced by whatever comes within range of my eyes, and try to reproduce it as a texture – no matter whether or not this is practical; I like to experiment anyway. 

Every single reference I pick differs from the others in terms of shape, color, arrangement, and so on. These diverse reference characteristics give me a lot of freedom to explore various techniques and workflows, which influences my style of art. 


My plan for creating these materials is based on this process: 

  • Height Map Generation – Height is one of the major components of any material; here I will be breaking down trims and creating height data for the shapes. 
  • 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 this it’s a good idea to look out for roughness map refinements. 
  • Ambient Occlusion Generation – Generating a good degree of depth with ambient occlusion, to give some life to your depth.  
  • Albedo Generation – Generating albedo is like taking a final pass over color values, using a blend of all 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 to polish my final roughness map. 
  • Final Pass – In the final pass I focus on my graph cleanup, as well optimizing it and polishing remaining maps for better output. 
  • Marmoset Render and Preview – I do a base setup with lighting to preview how the material is looking, then get high quality renders and publish them. 

For this interview, I’m going to break down the following materials from my portfolio: 

  1. Moroccan Ornate #12 

Moroccan Ornate #12 is one of my favorites from the ornate series. Vibrant colors and shapes make it a unique tile material.  

My goal for this material was to create some mesmerizing trim tile patterns and designs with realistic colors and surface approach. 

Height Generation 

The first thing is the shape and height buildup. For this I used a tile generator to create a 6×6 tile setup. Then I used a Safe Transform node, and turned it by 90 degrees to create a diamond shaped tile arrangement. After that, for the slanted bricks I used a tile generator and masked it out using a 2D Transform Node, and a Uniform Color Grayscale node (for custom masks). 

For the emblem shape I used a Polygon 2 node, and multiple 2D Transform Nodes, and blended to create that shape. Then I plugged it into a tile generator to create a trim, masked it out with a custom mask, and blended it with the main shape setup. 

For 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.56, I blended it with the main tile setup to get edge damage. 

Surface Treatment A 

In the surface treatment, I blended the main height with the Fractal Sum Base 2 to get some surface unevenness. Then I blended one more Fractal Sum Base, but with more rough noise to it. After that I used a Flood Fill node to create a gradient variation for tiles, and used a Dilation node to tighten it, and blended it over the main height.  

Then it took an Auto Levels node to level out all the details on height map. 

For secondary surface details, I used multiple noises, warps and non-uniform blur to get height surface variation, and blended them layer by layer using a Blend node with soft light and overlay blend mode to get the most out of levels without breaking up the actual height.  

Then, for more additional edge damage, I used an Edge Detect and multiplied it with a grunge map. After that I used a Bevel to dilate out the noise at the edges and subtracted it from the main height with 0.22 copy blend mode. 

Albedo Generation 

For albedo generation, I created custom masks using a Shape node and a Checker node (this was easy as it can be inverted for additional masks) and made a few additions and subtractions with a Blend node. Then I set outputs for masks to be used with that specific color on tile. 

After that, I plugged in a few grunge maps and a Curvature Smooth, which was created using the normal map in multiple gradient maps to create a specific color value for each tile mask, then I started blending them with each other using the mask which I’d created earlier. 

Then I created two additional gradient maps for grout and the surface weathering color, used HSL and levels to give it natural color values, and then I used masks to blend it over my main albedo. To give fake depth to the albedo I just used an AO node with very low value and blended it with the main albedo. 

Here’s a trick I found to give my material more natural approach: I used a Black and White Spots 2 node, and carried out a slope blur on it with Gaussian noise, then converted it into RGB using a gradient map and blended it over the main albedo with soft light blend mode. 

Then I took a Panorama 3D Position Map node and made it a tile patch, then did a directional warp with the mask I’d created earlier, using Flood Fill to Random Grayscale. Then I blended it over the main albedo color with a multiply blend value of 0.23. 

Here, I plugged my main height into a Normal node and used it as a normal map, and height into the height output and roughness which we’d created earlier while making color masks for albedo. 

Here I did a sphere render inside marmoset tool-bag 3. 

Now, the second material I’ll break down: 

  1. Ancient_India_01 

This material belongs to my Ancient India Substance series where I tried to replicate ancient Indian temple walls in Substance Designer.  

My goal for this material was to create stone carved-out patterns and shapes, and replicate them with a realistic approach. 

Height Generation 

For this material, I started by blocking out trims appropriate for the shapes I wanted. First, I began to create a Floral Panel trim. I used a Shape node with square and circle shapes, a Hemisphere node and Linear Gradient 2, and started building the height for the Floral Panel. Here I used multiple 2D Transform nodes to make custom shapes as needed, and blended them over each other using various Blend nodes set to the addition blend mode. 

Then I used a tile generator with a horizontal tile setup and used the panel I’d created earlier as a custom shape, and I tiled our main shape to create a trim out of it. 

To create the swirl grill pattern, I used a Bezier Curve node (this can be found on Substance Share) and dilated it using a Dilation/Erosion node to make it thicker. After that I used a Levels node to level out all the noise and used a Non-uniform Blur node to give a height-based depth to curve shape. To subtract the depth in my curve, I used a thinner curve and blended it over the main curve using subtraction mode.  

For the grill creation, I created a duplicate of that curve and flipped it horizontally using a 2D Transform node. Then I multiplied it with a Linear Gradient 2 to create an inward effect. Using a Height Blend node, I blended it over main curve. Then here I used another tile generator and created a trim out of this grill shape I’d created. 

For bell poms, handles and additional trims, I used the same shape blend method as for the above trims, then blended all of them using addition blend mode to stack up all the trims in my height map.  

Shiva Throne and Shiva Statue 

For Shiva’s throne Panel, I started it using Shape nodes driven by various 2D transforms and blended them using several subtractions and additions, which resulted in creation of throne boundary panel. 

For throne I just used a tile random with brick shape and added it to the panel height. 

For arch I created a custom shape using SVG node and did a multiple blend with shape we created earlier to create temple arch and blend it with main panel height. 

Shiva Statue 

I made a subgraph for the creation of the Shiva statue. Here, I used the same height buildup technique to make every part separately and blended them over one another to build Shiva’s statue. 

Then I set the whole graph as single output node, and used it in the main graph, and converted everything I’d previously created for the Shiva throne and statue into trim, using a tile generator. Then I blended it with the main height, where all the trims are placed. 

For edge treatment and carving I used multiple slope blurs with fractal sum base, BnW noise, and Perlin noise, and I blended them via several layers on to of one another to establish a stone-carved feel for my main height. I did this from the lowest amount of noise to the highest, in order to get abstract carving variations. 

Albedo Generation 

For the albedo, I used a Normal node with an intensity of 20, and then a Curvature Smooth node. Then I plugged a Curvature node into a gradient map, and grabbed a few color values from a real-life Indian temple reference. For surface color variations I used a Histogram Scans for custom masks, HSL and a few gradient maps, and blended them over each other. This gave it a natural color feel and surface approach. 

For the height, I just plugged my main height into the height output, as well as the same height into a Normal node with an intensity of 5, and made it output as a normal. 

For AO, I used an AO node with my actual height, with an intensity of 0.2 to make it realistic. 

And for roughness I used my Curvature Smooth and leveled out values to get a thick roughness map. 

Here, I did a few renders in Marmoset Toolbag 3. 

Tips & tricks

I would love to share some tips and tricks with the community:

  • Substance Designer shares the same workflow as ZBrush in terms of building height on a 2D surface, but as a nodal version which can be used to create a variety of materials and textures on the go from macro to micro process. Just always keep that in mind and follow that method to work on your height accordingly. 
  • Beginners can look at Substance Academy and the official Substance YouTube channel for a proper introduction to the software. Wes McDermott shared a lot of tutorials which show how somebody can get started! 
  • For intermediate and professional artists, you guys can hop on various Substance series and packs created by senior texture artists like Daniel Thiger, Rogelio Olguin, Chris Hodgson, Vincent Dérozier and Jonathan Benainous. 
  • Whenever you start working on anything new, it’s always tricky in the beginning, but with time the whole process becomes much easier! 
  • If your node graph is big and heavy, always try to add comments, pins, or frames to help you find things more easily later. 
  • For an optimized graph, try to make custom (simple) generators and nodes!  
  • Exposing parameters is another beneficial option to make something super procedural and tweakable. 
  • When you feel that something is finished, check it in different renderers like Iray, Marmoset Toolbag or Unreal Engine 4, just to 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 soon. 

Being a material artist, I find Substance Designer a limitless tool for me. Its nodal workflow and proceduralism makes it a powerful material authoring. I’m gradually learning it in depth to create more custom nodes and generators to amplify my workflow, in order to make the best use of this software. 

Incidentally, Andrei Zelenco’s use of mathematical functions to create unimaginable yet very useful custom nodes always inspires me to get into the depths of the tool. 

Substance Alchemist

This software is a marvelous tool which turns any 2D image into a PBR material with a single click. Its potential, and its own distinctive nature, makes it a game changer, whether you’re creating a material from scratch, or scanning a 2D image, you can create hundreds of variations. 

It has easy library management, material blending and variation generation.  

The best thing about Substance Alchemist is that it comes with wide variety of filters and layering panels, which we can use to delight, mix, blend, weather, splatter or water the material. This provides a lot of possibilities. 

In conclusion, I can say it’s worthwhile and needs to be a part of material toolkit! 

Final words

Well, we’ve covered a lot of important topics in the answers above. I’ll be back with more materials and procedural creations in Substance Designer soon, so stay tuned! 

In the meantime, visit my ArtStation page for more materials and artwork. If you need anything at all feel free to write to me there! 

Want to learn more about Substance Designer? Check out our latest release here!
All images courtesy of Ishan Verma.

Read more