Andrey Frolov explained how he set up his bright cloth material in Substance 3D Designer and showed the splatter tool he made to randomly scatter the shapes of the pattern.
Materials are integral to any 3D project, be it environment or character art. Cloth can be difficult to get right, but if it is, any asset becomes more complete. To learn more about the process of creating beautiful textures, we asked Andrey Frolov about his quilt-like cloth made with Substance 3D Designer.
Introduction
Four years ago, I embarked on studying Substance 3D Designer. Before (as well as now), I worked with 3ds Max, lacking substantial knowledge in texturing. I harbored a great fear of nodes and all related aspects. When I realized that advancing required honing my texturing skills, broadening my expertise in both texturing and 3D modeling became imperative.
My learning journey primarily comprised YouTube tutorial videos. In the beginning, I had no idea about the sheer brilliance of Substance 3D Designer. I anticipated mastering fundamental texturing techniques and moving on, but the reality unfolded quite differently – Substance 3D Designer began to consume all my spare moments. I would find myself engrossed in graphs for hours on end, oblivious to the passage of time. Every free minute was dedicated to opening Substance 3D Designer. Its allure was simply insatiable, a truly marvelous program.
Cloth in Substance 3D Designer
In the 13th version of Substance 3D Designer, numerous impressive features were introduced for working with splines and paths, simplifying the process of creating patterns and textiles. In order to master all the new nodes, I concluded that undertaking several independent projects was necessary. "Cloth" was one of such ventures.
When I selected an appropriate reference and began the task, I thought I would complete it in a day. However, I was mistaken; several difficulties arose during the process, leading me to postpone the project and contemplate solutions to these challenges. One such obstacle, for instance, was the splattering of non-overlapping shapes. But we shall revisit this later... For now, allow me to narrate the sequential progression of my work.
The first aspect with which I opted to commence was the creation of lines and filling the background between them.
I could have taken a gradient and curved it using Directional Warp, then applied the quantize node, but the outcome did not impress me.
Furthermore, it was necessary to convert all of this into splines. Another solution had to be found. I opted to work directly with splines. I chose to employ the Spline (Poly Quadratic) as the foundational method, utilizing three points aligned horizontally on a single line.
I then curved it using the Spline Warp node. In the Intensity input, I utilized a Pixel Processor, which generates a gradient based on sine and cosine functions. I specifically chose to use them because they produce a very smooth and aesthetically pleasing curve. After several experiments, I arrived at the following graph in the Pixel Processor.
So, one curved spline based on the sine function was created. I calculated that I needed to create 11 such splines, and in each of them, I duplicated my Pixel Processor node, adjusting the customization parameters in each to achieve a visually appealing look.
Let's step back a bit to the Spline (Poly Quadratic) node. Within it, I created an additional input – Input Values (#Y). This input receives the Y value – the position of the spline points. I know that the gradation along Y ranges from 0 to 1, so I simply divided 1 by 11, resulting in 0.090909. The spline points would then consist of the following values: 0; 0.0909; 0.1818; 0.2727... and so on until 1. I chose to calculate these numbers all in one node, but you can simply insert these values there.
Now we have 11 splines ready. Next, I took two neighboring splines, connected them using the Spline Append, and then the Spline BridgeMapper Gray to fill the background between them. I took the fill values all from the same #Y coordinates. They pleased me as they provided a smooth discrete increase in grayscale from 0 to 1.
Minor issues arose with the filling of the first and last splines. However, with the help of Spline Transform 2D and Transform 2D, the problems were resolved. As a result, I managed to fill everything with varying grayscale tones.
I created a small island using node distance.
Next, using the Spline Mapper Grayscale, I began creating the initial pattern.
The following artwork was created using overlapping circles, utilizing the Tile Sampler Color and alpha channel. I prefer using GIFs because they present no difficulty in this workflow.
Next, mountains and palm trees were drawn. Nothing extraordinary was present there. Everything was created from standard shapes, then the Tile Sampler was used and subsequently overlaid on the splines that we created initially using the Spline Bridge Mapper.
The giraffe was drawn using the Spline (Poly Quadratic), tracing the splines based on the original design.
Furthermore, additional layers were drawn using standard methods.
I then encountered an issue with drawing the lower mandalas so they were circular and non-overlapping. Initially, I chose to distribute a few mandalas using Scatter on Spline Grayscale.
But there were not enough of them. I needed to add more shapes. Ultimately, I decided to create my own splatter tool that randomly scatters shapes based on the chosen mask. I quickly created the mask, but developing the splatter tool took more time. It is based on FX-map and looks like this:
I utilized only the Map_Splatter and Shape inputs. The column of levels represents the input mask maps with dimensions ranging from 2x2 px, 4x4 px, 8x8 px, 16x16 px to 8192x8192 pix. All of them are involved in determining the placement of the shapes.
How does this work? I take a 2x2 map. By default, the spawn point of the shape is (0,0). I take the grayscale value of each pixel and sum them up, resulting in a number within the range of (0,4). Then, using a random function, I find value A1 within this range. The comparison starts. The first pixel (its value B1) is compared with the number A1. If A1 is less than B1, the point remains in the first pixel, with coordinates of (0,0). If A1 is greater than B1, then A1 is compared with the sum of the first and second pixels (B1+B2). If A1 is less than this sum, the spawn point moves to the second pixel, with coordinates of (0;0.5) – this is the second pixel in the 2x2 matrix. This process continues for all 4 pixels until a new spawn point is determined. Moving on to the 4x4 image, I repeat the process, but this time with only four points out of the 16 that belong to the 2x2 matrix. This way, I randomly determine the spawn point precisely on the mask. Then 8x8, followed by 16x16, and so on. It appears as follows:
And thus, I completed the missing mandalas, swiftly moving on to the next challenge.
Here is another layer with mandalas. By the time I reached this point, several days passed, perhaps even a couple of weeks. I had to work on other projects in between. By this time, I developed another splatter tool for myself. This new tool scatters shapes randomly without intersection. And so, here is the second splatter tool:
The basis for selecting the spawn point remained the same. The differences lie in the following aspects:
1. The scale of the shape is determined by a Distance node from the input mask:
It is crucial that the maximum distance is 256. Then, in the FX-Map node, the scale of the shape can be calculated as follows:
Another significant advantage of this splatter tool is that it can create up to 8 non-overlapping shapes within a single node (by placing them one after another, we can quickly fill all the masked space). I implemented this by declaring 8 variables with initial coordinates (10,10) – these are positioned far beyond the square area of Substance 3D Designer. As soon as we determine the coordinates of the first shape, these coordinates are filled in at the first point. When identifying the next shapes, we check how far the point is from the previous ones. If it is too close, and drawing the shape overlaps with a neighboring one, that particular shape is not rendered (Luminance = 0).
This initialization of 8 variables is done first.
This is the verification of the distance between the points already found.
Ultimately, by creating a sequence of such splatter tools, I illustrated non-overlapping mandalas.
At this stage, I was filled with great joy as I had finally resolved the issue of non-overlapping shapes once and for all. The last pattern remaining was the randomly scattered, non-intersecting spiral figures. I approached creating these spirals in a similar method to the mandalas. I used the splatter tool to generate non-intersecting shapes one after the other based on a mask. The spirals themselves were crafted from a Spline Circle node, then passed through a Spline Warp with Gaussian Noise applied before finally utilizing Scatter on Spline Grayscale:
At this point, the work on the pattern came to a close. It was the longest stage with unexpected surprises. Moving forward, I created seams with splines resembling threads and decided it would be fitting to add stitches onto the fabric, giving the impression of a finely quilted blanket. To achieve this effect, I utilized a Shape node (Pattern – Ridged Bell), which I scattered along the seams using the Tile Sampler. The seams were defined by the input mask splines in the Pattern Distribution Map Input. With the assistance of a Normal Map, I oriented the forms perpendicular to the seams. Next, I applied Vector Morph Grayscale to them with an input Normal rotated by 133.82 degrees. This resulted in a finish that closely matched the desired outcome. I then used a Pow Grayscale node to create a slightly inflated appearance in the grooves. Lastly, I slightly distorted the folds using a Non-Uniform Direction Warp node.
Maps
The color map emerged from the Grayscale Map that I had created initially.
I inputted this map into the Gradient Map node and positioned around 11 Gradient Keys at roughly equal intervals along the gradient. I fine-tuned the colors within them to mirror those in the reference image.
Then, I blended it with the Pattern Map using the Add Sub mode (the base color of the pattern background was initially set at 0.5). I introduced a hint of the Curvature Map – revealing the fabric texture (also in Add Sub mode), and with that, the work on the Base Color was completed.
The standard Wave 2 node was employed for the fabric texture. It then proceeded to Normal, AO, and Roughness. I did not dwell extensively on the roughness aspect. I refrained from creating abrasions and fabric-worn effects, as the primary goal was to convey the design using new nodes in Substance 3D Designer 13.0.0. An inverted Wave 2 was involved in the roughness, blended slightly with the pattern via the Multiply mode, and I fine-tuned this using Levels.
The challenges lay in crafting non-overlapping splatters of distinct shapes, as I previously detailed in the modeling process. It might not have been entirely clear, hence I am attaching the SBS files for these splatters along with a portion of the graph from the beginning, where I utilized sine and cosine to create curved lines.
Parameters
Initially, I intended to make the material entirely parametric; hence, I initially created the curved lines through the Pixel Processor. Essentially, this aspect can be further refined in the material, allowing the pattern to change entirely by altering these lines. Only the color would remain, and this too can be easily adjusted in various directions through the HSL node. However, I invested a significant amount of time into it and found myself exhausted by the immense volume of work completed. Consequently, I chose not to expose any parameters. I reiterate – it is poised to be sufficiently flexible, allowing for easy modifications of its appearance.
Conclusion
Excluding breaks due to my primary job and discounting the time spent developing splatters, I spent around one full working day and three evenings on this endeavor.
General advice for beginners: practice. As cliché as it may sound, in Substance 3D Designer, practice is paramount – a great deal of practice, an abundance of practice. Devote significant time to watching tutorials on the software. Various individuals offer streams with their own unique tips and tricks. Only through this process will you begin to grasp Substance 3D Designer independently. It is at this point that you can examine a reference, envision an approximate workflow, and understand how to create the desired texture.
Furthermore, do not hesitate to delve into programming in the Pixel Processor and FX-Map. Once you understand these aspects, your Substance 3D Designer skill will grow substantially, you will be able to craft incredible patterns previously beyond your imagination. Increasingly, you will incorporate your own textures into projects rather than relying on stock materials. Therefore, do not merely scratch the surface in your studies; delve deeper, and you will unlock its vast potential.