Creating Soda Cans Material in Substance Designer

Creating Soda Cans Material in Substance Designer

Leonid Sadekov prepared a breakdown of his procedural Soda Cans Material created in Substance Designer.


Hello, my name is Leonid. I am a self-taught 3D artist from Moscow. In the beginning, I devoted most of the time to studying hard-surface modeling and programming, because I’ve always been better at technical things, rather than artistic ones. As time passed, I started to realize that I wasn’t giving enough time to explore texture creation and eventually began to study Substance products. Both programs - Painter and Designer - are excellent for their tasks and satisfy almost all artists’ needs, but for me, Substance Designer has been more exciting. The things that people could do using only its toolkit were impressive. That’s what stroke me in SD – the ability to continually discover new things and find out how far you can go.

Learning Substance Designer

At first, I had a hard time understanding the production of procedural materials. Attempts to learn Substance Designer alternated with long-time breaks after which I had to learn almost all over again. But when a friend of mine, more than a year ago, offered to participate in Polycount Bi-weekly Challenge, I started to work in it more regularly. At the same time, I took an online course on procedural materials at XYZ-School. Other resources also helped me along the way: tutorial videos, articles, breakdowns, and material graphs from other artists. The large Substance community has a lot to offer, so don’t confine yourself to a specific format, but use all available resources to study.

Soda Cans Material

Soda Cans Material

The creation process for this material began with a search for ideas for the #nodenovember challenge from the Mentorship Coalition. Before starting the material, I usually take a little time to practice some new things. Taking inspiration from artworks on Artstation, I got hooked on the idea of making something like folds, just for practice. The search for references led me to images of wrapped cardboard trays with soda cans inside. It’s seemed like an excellent concept for a procedural material, so I began gathering more pictures for reference.

It’s always good practice to first breakdown the production into separate steps, so it is easier to focus on the current task. This material has three main elements: cans, cardboard tray, and wrap. We will look at each one separately, moving from simple to more complex things.

Creating Cans

The first step was to make cans. I used Shape Extrude node to make a single can, where I passed Gradient Linear 1 with Curve node into its Profile Type input. By adjusting the vertical gradient value with the curve, I control the shape scale along its axis. That way, I can create different interesting shapes, such as a soda can.

When working on labels, I used simple combinations of Text and Transformation nodes. Nothing fancy, I just typed in a text and rotated some shapes trying to find the right spot.

There is only one thing worth mentioning. Creating the Pepsi and Coca-Cola logos, I applied Clark Coots' method to create curve shapes. His approach is remarkably helpful when you need to deal with smooth lines. I recommend you to check out his Artstation to find some more useful tips for Substance Designer.

To add label images to the cans, I used FloodFill Mapper node from the last annual release of Substance Designer. It allows you to remap existing texture from the node’s Pattern Inputs onto every single cell from Flood Fill. The source for Flood Fill input here is the row of cans from Tile Generator. I used only two Pattern Inputs, but the node allows you to use up to eight. FFM node makes it easy to control the random position of input images along axes, allowing each can look unique. The current label selection is controlled by Distribution Map; in my case, it’s a simple Uniform Color node. To control label selection, not with a float slider, but with a drop-down list, I created a new empty function where I divided the number of the currently selected input by a maximum number of enabled inputs. So, when I choose an item from the drop-down list, the map’s color changes to the appropriate color range. After that, I combined height and color information in Alpha Merge node to use it in the main graph.

Before we put some cans into a tray, first, we’ll figure out how to produce rows of cans and cardboard tray from a single tile pattern. The cardboard tray holds 24 cans, so there will be alternating stacks with six and four cans inside. Instead of using Tile Samplers for different rows, I decided to try an alternative approach. I passed six variations of can’s rows into Pattern Inputs of Flood Fill Mapper, which remapped to each cell of Tile Generator, representing tray’s rows. FFM node has the Size Mode option for determining pattern size inside each cell. If you choose “Relative to Largest Shape”, the node will set the pattern size according to the largest cell. Here it corresponds to the front side of the cardboard tray (six cans). The smaller cell corresponds to the sides (four cans). So, when a row of six cans is remapped onto the largest cell, it gets no distortion, and the shorter side just cuts off the two cans, leaving only four inside.

Creating Cardboard Trays

When cans rows were ready, I started to create a cardboard tray. Its shape is determined by the same pattern as for cans, so they will always be corresponding to each other.

After that, I made a cardboard tray mask and several nodes that would help to add height variation, control Flood Fill Mapper nodes, mask front or side part of the tray, etc. Since this part of the graph would be reused across the graph, I placed it above everything else to have links through the entire work area without crossing frames too often.

The cardboard’s texture is pretty straightforward. There is no need for something complex because most of the cardboard will be wrapped. Moisture Noise node passed through Highpass Greyscale is blended with big and small cracks and complemented by vertical cavities. I think that it could have been made simpler. The resulting noise will be later used for making base color.

There is a cover on a cardboard’s tray sides, which I wanted to add to my material. For this purpose, I used a Non-Uniform Blur node. The mask of the tray’s sides is enabled to both inputs, blurred vertically and horizontally with anisotropy, and the result is selected with a Histogram Select node. Then one more NNB node is used to blur the cover’s lower part for better blending with the base cardboard.

But that cover is visible from the front view too. So, using Anisotropic Blur, I blurred the mask of tray’s front horizontally, used the Histogram Select for the side edges, and subtracted the further result from the existing heightmap.

Creating Plastic Wrap

Now it’s time to wrap everything up. This part was the most intriguing and essential. To make a wrap transparent, I decided that its presence must be seen only through Normal and Roughness maps. The cans itself would mainly remain in Base Color, although it still has a presence in the heightmap. To create a multilayer look, I made a lot of different creases, which crossed the area of cans and cardboard tray. Their overall combination helped to make the wrap look distinct, but it took a lot of experimentation to get a rich and balanced result.

To make a basis for the wrap, I choose Non-Uniform Blur node. Its first input is the main heightmap [3]. The second one is the mask from the first Tile Generator. As a result, I got a heightmap [4], with the first link leading to Histogram Scan, and the second one to Blend node [5], where it’s blended with previous heightmap [3]. I blended two heightmaps to increase height value in dark spaces between cans. That way, I got better results for imitating wrap after applying anisotropic blur. The blur value of Anisotropic Blur node controls wrap’s tension. If the value is too high, the resulting heightmap will be flat. If it is too low, the wrap will be faintly noticeable between cans. Because of that, I needed to maintain the balance between the components to make them both visible.

Adding Hand Holes

Before going any further, I decided to add hand holes on the box’s sides. Since I would be creating different creases on the wrap, they must consider the presence of these holes. For that, I could use the hand’s holes mask to warp creases near them.

After studying more references, I noticed that if a wrapping paper isn’t dense enough, then large folds are forming below hand holes. I used Shadow node to get a mask strictly under the hand’s holes. Then through the Non-Uniform node, I blurred it horizontally with different blur strength. I passed the mask with varying values of grey into Blur Map input to get that effect. Multi-Directional Warp node with Average mode and four directions enabled gave the feeling that the mask diverges into different fibers, which worked perfectly in my case. I blended the result with Directional Noise 3 [4], and then with Perlin Noise [5] to make height information less uniform.

Adding Folds

I had to do a lot of experimentation with wrap folds. Because they exist only in Roughness and Normal maps, their visibility is highly dependent on lighting direction. So, I made several different variations, probably more than can be met in reality on the same piece of wrap. Hence, it was essential to balance the folds' look so that nothing would distract too much attention, creating a coherent appearance.

Vertical creases begin with blending a couple of Crease nodes. Highpass Grayscale is used to level grayscale values. Then Directional Blur node is applied to add more vertical blur. Then with warps and slope nodes, I add variety and blend it with the existing heightmap.

Horizontal creases are created similarly. I mostly use Directional Blur, several Warp, and Levels nodes. I wanted to focus them closer to the cardboard tray so that they would diversify the look but not overlap too much with the vertical creases. The mask makes them appear only on the tray’s front side.

The short sequence of Tile Generator, Blur, and Highpass Grayscale nodes gave me the subtle effect of bubbling paper.

Medium creases are adding a nice variety to the tray’s front wrap. I approached them in the same way as holes creases.

On the box’s sides, a wrap should be loosening a bit because of hand holes, so I added small horizontal creases that are centered on top of the cans. Then, I blurred them horizontally through Anisotropic Blur, inflated them with Slope Blur Grayscale, and blended with Perlin Noise node.

On the box’s front wrap, I added small vertical folds, close to the cans’ tops. The folds themselves are again quite straightforward - Tile Generator, Anisotropic Blur for the vertical blur, levels for upper isolation part of cans, and Perlin Noise for height variety.

The last graph’s frame is the long thin creases that run along the front bottom of the tray.

At first, I added barcode images as part of boxes drawings. But then, I noticed that on some references, they were placed over a wrapper as labels. I immediately liked the idea because it added a nice variety to the overall appearance, contrasting with wrap, especially in Roughness Map. Their graph section is quite simple. It’s only Text and Transformation nodes in most parts. To make each barcode look unique, I edited it with Gradient Maps. Once the labels have been positioned, I slightly warped them using the heightmap as directional input.

Base Color and Roughness

For cardboard’s base color, I only blended some noises with the primary color. Images on the cardboard are again positioned by Flood Fill Mapper node, where the tray’s box mask is used as Pattern Distribution Map.

Once again, I violate some PBR rules by adding an inner shadow to the can’s base color. It’s necessary in order to make them look less flat. Although the wrap should be transparent, I decided to add a bit of white color to the densest folds to emphasize them.

The cardboard appearing through the hand holes and barcode labels helped to break the roughness continuity of wrapping paper.

Customizing Material

As I said earlier, the Flood Fill Mapper node controls label selection through the drop-down list. It only needs to provide the desired image to a node’s input to make it appear on the cans. The Histogram Scan node establishes the height of cardboard trays. Almost all the available settings for components ranging from hand holes to barcode labels are scale, position offset, rotation, blur values, etc. As you see, all these parameters can be easily exposed inside Substance Designer.

Material Presentation

Since the appearance of the wraps’ folds mostly depends on lighting, I used a lot of spotlights. More precisely, there is one common light source that illuminates the whole scene and sets the environment’s tone. Other few small directional lights illuminate wrap’s parts. I tried to light up the scene so that it would show the fold’s variety on each cardboard tray, without overwhelming the final render. I did a lot of tweaking with shape’s length of directional lights because it helped to make them less intense, keeping an overall brightness value.

The rest of the lighting settings is a pretty standard Marmoset setup with Global Illumination, additional shadows, AO, etc.


That's all for this breakdown. It was quite an exciting material to make, although I made some mistakes while working on it. For example, the cans still look flat and the barcode labels are far too white. But still, it's all part of the creation process. Thanks to the community for all the feedback! 

And thank you for reading! If you still have any questions, feel free to contact me on Artstation

Leonid Sadekov, 3D Artist

Interview conducted by Arti Sergeev

Keep reading

You may find this article interesting

Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more

    Creating Soda Cans Material in Substance Designer