Ishan Verma talks about getting into material art in Substance Designer and exploring the possibilities of color adjustments using mathematic formulas.
In case you missed it
You may find these articles interesting
My name is Ishan Verma and I work as a 3D Material Artist at Ubisoft. In this article, I will explain how to create mineral/ore materials and give you a few tips on discovering vibrant color blending. It will be a brief step-by-step walkthrough where I will cover points like brainstorming, reference study, height building, and material creation.
Looking for Ideas
First, let us talk about the ideation. The main idea behind this study was to explore color workflows and to create something new out of them. So, I started exploring reference images and came across some colorful ores. I found those to be quite vibrant and going in tone with what I was planning to do. So it led to the creation of ores and mineral substances.
My workflow consists of a step called reference study, where I collect references for the idea I thought of. What I am looking for in the images are large, medium, and small details, textures, surfaces, and vibrant hi-res colors I can use later on. Also, I try to find some images for practical use that show me how this texture or material can be used further once done.
Height Building: Base Surface
Now I will talk about Height creation. I started creating a base surface using a tile sampler with a bell as the shape input and a blend of clouds 2 and crystal 1 to drive the shape and splatter it around.
For surface distortions, I applied Non Uniform Blur and used Directional Warp on them. Then using this warp, I used Slope Blur to create shape unevenness. Then I just inverted it and used histogram range to create a slight highpass and neutralize the depth.
Then we hop on creating Base Shape 1, here my main idea was to create slight abstract shapes using cells. For that, I used another tile sampler with a square shape as input, a normal map from the surface we created earlier to vector warp shapes, and Grunge Map 13 for a custom mask.
Then I used the Distance node and drove up tile sampler data to the max so I could have an abstract cells arrangement. Then, using the Distance node I created two cell dispositions.
For the first one, I used Histogram Range to range out abstract random grayscale values and mask out a few, then for the second output I used the Edge Detect with bevel. Then I blended both of them with minimal darken mode and used the Invert and Levels nodes to tighten up the shape.
Then using Base shape 1, I created more surface variations and surface deformations called Base Shape 2. For that, I used the output from levels and blurred it out using Blur HQ grayscale, then a histogram scan to create a uniform mask, then blended it with the main Blur node using Subtract blend to create edge detect as output with a slight gradient. After that, I put it in a tile sample on custom mask input. In the same tile sampler, I used a leveled-up bell shape in shape input. Then I inverted it.
Then I blended the inverted tile sampler with Base shape 1 data using the Soft Light blending mode. Then I blurred it out and leveled it down.
Primary Surface Blends
Once we are done with the base shape, we will use it to create Primary Surface Blends. For doing that, I created a blend of Base Shape 2 and Shape 1 we created earlier with an overlay blend mode. Then I did the Auto Level with one histogram range to lower the values and blended it with the base surface using the Soft Light blending mode.
Then I used the Auto Level node, combined it with the Non-Uniform Blur node and histogram scan, then blended it with primary surface blend using the Overlay mode.
Secondary Surface Blends/Pores
First, we hop on creating an edge pore, for that I took the Primary Surface and blended it with the tile sampler we created earlier but this time I used the Divide blend mode to subtract the inverted pore data with a slight tint of the Primary surface data.
After that, we are going to go into creating secondary surface blends. I started working with the Crystal 1 node and did an emboss to the primary surface, then did the Auto Levels and Level node to fix the tones and values. Next, I did the Height blend with the edge pores and the surface we created earlier to give it a porous edge feel and fixed the tone range with the Auto Level node.
At last, I added one Quantize node and blended it over the main shape to create a directional fractal shape effect on top.
Once done with creating the main surface for the ore, I focused on the two final parts of height creation, one is Surface Warping, and the second is Surface Noise.
For surface warping, I started creating a custom noise which is a blend of four noises that are Grunge Map 004, Scratch Generator, BnW Spots 1, and Clouds 1. A few blur and directional warps will do the job here with the Overlay surface blend mode.
Then I used this custom noise to directional warp the main surface and then did the Slope blur to add more surface deformations.
For surface noise, I just added the Moisture Noise node with a slight tiling using the Safe Transform node. Then I warped the main shape using two Directional Warp nodes and drove those by the base Moisture Noise. Then I blended the warped shape over the main one using the Soft Light Blend mode.
Diving Into the Colors
For the Albedo map generation, I dove deeper and tried to create a non-destructive color map pipeline and generally spend quite a decent amount of time with a lot of iterations to create a node named ColorTools. This node is majorly inspired by Ben Wilson’s Candyshop presentation and color math.
Let us talk about this node first, and I will give a brief description of the workflow I did for the node.
This node uses the Tile Generator node which is driven by a chrominance color space math expression. Then that math converts RGB values given by raw color data from any kind of noise which is driven by a Gradient Map. Color values in the gradient map can be picked manually or drawn over any image. Once plugged in Raw Color data input it will create a chrominance value chart of specific color taken from the gradient map.
Then the second input is for the Normal Map, the node takes that normal map and creates 10 different mask derivatives. These derivatives are masks taken from variants of the curvatures and RGBA splits. Then these masks are driven with each chrominance sample we took from the input above and creates a series of color which can be layered again and again to get non-destructive color outputs.
Hence, changing anything in the Height Map here will not be affecting the gradients as well the final Albedo.
The basic math for chrominance chart conversion I used here is the following:
Convert the RGB values to the range from 0 to 1, this can be done by dividing the value by 255:
R = Color Chrominance from node/255
G = Color Chrominance from node/255
B = Color Chrominance from node/255
Find the minimum and maximum values of R, G, and B.
min=(the R value)
max=(the B value)
Now calculate the Luminance value by adding the max and min values and divide by 2.
(max + min)/2=Luminance
The Hue formula depends on what RGB color channel is the max value. The three different formulas are:
If Red is max, then Hue=(G-B)/(max-min)
If Green is max, then Hue=2.0+(B-R)/(max-min)
If Blue is max, then Hue=4.0+(R-G)/(max-min)
Blending all of these will give a non-destructive workflow for HSL, HSV, sRGB, and Chromas.
Luminance here refers to the brightness of color values and Chrominance refers to color values themselves. Here in the node, the main driver is Chrominance Grid. This grid is created by the tile sampler and chrominance math I talked about above. Here, the blend of Chrominance and Luminance gives the final output as converted RGB values.
To create the Albedo Map, I used Adobe’s Image Gradient tool to extract the color values from the real-life ore images.
Then I used the method I talked about in the above topics and drove Gradient Maps to pick all color data derived from the Adobe color tool. Then I created multiple sets of color drivers and used masks taken from the Curvature smooth and RGBA splits and blended them on each other.
Once these are blended, we have a non-destructive node map workflow here, for any color change we just need to tweak the color driver slider. Changing things in the Height Map will not affect anything in the color data and pixel positions as we already set them using colorspace math.
For macro roughness, I took one Grunge 12 map and warped it directionally with the Height Map as intensity. Then I used the Dust node to create a speckle mask and blended it with a grey color base. I blended it using Max (Lighten) and then blended it again with the Soft Light mode.
Then I just blended the directionally warped Grunge Map on top of the Speckle Map and subtracted from the Micro-Roughness Map we created previously and we are done here with the creation of the Roughness Map.
For the AO map creation, I used an Ambient Occlusion node with a spread of 0.15 and played with frequencies to get a stable depth, and excluded all top surface data from it.
Then for extra surface angles and micro-detail occlusion data, I used a normal with curvature smooth and used histogram scan to create a mask for top flare surface data and crevices. Then I blended it using the Multiply mode. Then for leveling up the frequency I used Histogram Range to level up the range of the following blend and plugged it in the AO output.
Renders have been showcased in Unreal Engine 4.
Here are a few more examples of working in UE4:
The most difficult part was creating the Color Tools node, as I am a bit new to colorspace math and functions so a lot of iterations and attempts went there. Another challenge I faced was layering different color elements and having correct color values in a contrasting manner so changing height would not affect the color pixel positions. I definitely learned a lot from this project, like creating a non-destructive Color Map workflow and along with that, it made me achieve my primary approach towards colorspace math and functions in Substance Designer.
My main goal was to create a different approach towards getting a definitive and color corrected Albedo map, so it led to creating a new node which is a game-changer for my material projects. Color tools are still in progress as during this project I found that there are more valid options and features that can be added to it to make it better. I can say that once it is done, I can make it available for the marketplace.
My advice to the readers is that in Substance Designer there are vast possibilities to create your very own tools and nodes to fasten up the workflow, try to dive in deep, and use the best of it.
Feel free to contact me on my socials in case you have any questions.