Materialize: Joe Lambert Breaks Down MDL Material in Substance Designer
Today we talk with Joe Lambert, an 18-year-old 3D hobbyist from England. He got into Substance working on a high school project and then decided to take part in the Materialize Substance Designer Contest. He won 2nd prize in the MDL category by reproducing a felt with structure reference from the Mattershots Instagram channel. Here is the breakdown of his material, which you can also download on Substance Share here:
The initial shape of the material was created by stacking a series of ridged bells using the lighten only blending mode. Although I could probably have done this more efficiently by using a single shape and transforming it a number of times, I used multiple shapes so as not to cause tiling issues arising from scaling it up and down with the Transform node. Alternatively, I could have simply used a Splatter node, but in order to do that, I would have had to sacrifice some control, which I didn’t want to do. Once I’d stacked the shapes to my liking, I blurred the result slightly and normalized the whole thing using the Auto Levels node – this was an important step for me, as it allowed me to use the Histogram Range node to precisely control the weight of each element (bulges, struts, felt surface etc.) in the final height map.
Probably the most novel element of the material, as far as the non-MDL graph is concerned, was the peeling away of the felt at the top of the height map. To achieve this, I subtracted the basic shape of the material from a tiled linear gradient. This served to ‘widen’ the dark areas of the gradient, which becomes very obvious when the contrast is increased using a Gradient node.
In order to introduce a sense of volume to the material, I blurred my results so far twice, once slightly, and once much more heavily. Using the Subtract Blend node to blend the heavier blur over the lighter one, I created ‘ridges’ around the slits in the material, as well as bevels in the height map; this made it usable once plugged into a Normal Map node (stepped height maps don’t create good normals). Again, I ran the result through an Auto Levels node.
Producing the metal struts that give the surface structure was fairly simple: using the Stripes node, and altering the falloff with a curve was all that was required to create the shape I needed. Blending the struts into the main height map was equally straightforward – I used a Histogram Range node to halve the height of the struts, then used the Height Blend node, so that the struts appeared only in the slits I had created earlier. The protrusions then needed to be included in the height map. This was done additively, but as I didn’t want the details I’d created to clip at the top of the height map, I used the Histogram Range node, giving the slits, ridges, and struts together a range of 0.05 and a position of 0.025. While I decided to parameterize the contribution of the main bulges, I clamped that to a maximum of 0.95. In this way, the whole construction could not exceed a value of 1, and therefore no detail would be lost.
The two materials I needed to create were felt and metal (the exact kind was largely determined using parameters). These were created in large part by layering and warping noises to create interest, but one particular element of the felt is perhaps worth exploring a little. In order to create a kind of fuzz on the surface, I used the (then) brand new Scratch node to create thousands of tiny fibers, which seemed to mimic quite nicely the way felt is constructed. I subtly blended the details from these materials that I wanted to see in the normal map, and then combined the whole thing using Base Material and Material Blend nodes. Finally, I created a utility output named ‘velvet’, which was simply to hold a noise texture for later use in the MDL shader, which I worked on next.
Obviously, a metal shader does not have a diffuse component, so putting one together was relatively simple – only a Microfacet GGX node and a directional factor were required (keep in mind that everything has Fresnel). Having said that, the construction of the fabric shader was hardly physically accurate – as the cloth was 100% rough, I chose not to use any glossy component (even though it should have had one). I did want to add a sheen, or a kind of ‘peach fuzz’, however, which couldn’t be done in the real-time graph. And so, as I’d already done with the metal shader, I used a directional factor – this time with the exponent exposed so that I could plug in my ‘velvet’ map. In a few places, I worked in multiply operators, so that I could weight various effects with a single, easily visible float.
One of the judges explicitly mentioned my use of the Displacement node, so I’ll briefly address that. I didn’t want the shader pushing geometry down/inwards, so I worked out which value in my height map was ‘level’ and forced the whole thing into the range 0.5 < x < 1, using an add and a multiply operator. Then I exposed the displacement scale parameter so that I could see at a glance the value to which I’d set it. Lastly, I used a cheat I learned using Blender’s Cycles node editor, applying it to the AO map – a weighted layer with a black diffuse surface, driven by the AO map, using a specular BSDF to cut out the gaps in the struts. All that was left to do at this point was set up some lighting, abuse IRay’s good looking DoF, and hope my computer didn’t crash while I rendered the final images!
All images courtesy of Joe Lambert