Love your stuff! thanks for the info. You achieve surprising graphics using Unity which is great news.
is that images related to coc generals 2? zero hour ?
@Tristan: I studied computergrafics for 5 years. I'm making 3D art now since about half a year fulltime, but I had some experience before that. Its hard to focus on one thing, it took me half a year to understand most of the vegetation creation pipelines. For speeding up your workflow maybe spend a bit time with the megascans library. Making 3D vegetation starts from going outside for photoscanns to profiling your assets. Start with one thing and master this. @Maxime: The difference between my technique and Z-passing on distant objects is quiet the same. (- the higher vertex count) I would start using this at about 10-15m+. In this inner radius you are using (mostly high) cascaded shadows, the less the shader complexety in this areas, the less the shader instructions. When I started this project, the polycount was a bit to high. Now I found the best balance between a "lowpoly" mesh and the less possible overdraw. The conclusion of this technique is easily using a slightly higher vertex count on the mesh for reducing the quad overdraw and shader complexity. In matters visual quality a "high poly" plant will allways look better than a blade of grass on a plane.
Adam Dudley wrote a fantastic breakdown, detailing all the steps in the production of this amazing substance.
Creating the Ridges
In Substance Designer I start with the metalness/roughness template. In creating this, and any material, my first step is always to start with the height map – in this case, creating the large forms of the snow ridges. I would suggest setting up your graph with a mid-grey value plugged into the albedo and roughness output whilst you create your height. This help you to focus on the height without being distracted by diffuse or roughness.
To create a ridge shape, I started with a simple vertical gradient, ran through a gradient map to get a peak with fall-off, leveled off to give me the full range and slightly blurred with a Blur HQ Greyscale. I fed this ridge shape into a tile generator, with the pattern type set to ‘input’, with the Y value set to 3, to give me three horizontal ridges. I then played with the random mask value until to top ridge was masked off. I did this as, after experimenting, I found that having two offset ridges worked better for texture tiling, as three equidistant ridges led to very obviously tiling and an unnatural looking repetition. After this I used a Transform 2D node to slightly scale up the two ridges vertically, just so there was less of a gap at the top of the texture.
Next I wanted to start to introduce the natural flow and form of snow ridges. I used several Directional Warps with various noises to create larger shape distortions in the ridges, before another Directional Warp with a more detailed noise to create a noisy/pitted/distorted version of the ridges. This pitted version of the ridges was then blended with a previous ‘clean’ version of the ridge, masked with a levelled copy of the initial ridge shape to give just the peak area. The purpose of this was to create some distortion along the main edge of the ridge peak to help add some natural shape and avoid any look of procedural uniformity.
To start to create the wind-blown effect, I used a Non-Uniform Blur with Perlin Noise Zoom to create vertical distortion in the ridge shapes. I then added a slight Slope Blur to add some subtle disorder and peaking/pinching to the gradients – again this was to add subtle variation to help create a more natural, less procedural effect.
At this point, the ridge shapes were coming together, but they needed more height variation across the ridges horizontally, so I created a shape to cut into the main ridge to introduce that variation. This was made using the Tile Sampler node with X and Y values set to 5, Pattern set to Gaussian – this gives some interesting cells shapes. The result was then slightly blurred, Auto Levelled, then inverted as its intended use was to be multiplied back into the initial ridge shape.
Adding the wind effect and undulation
With the larger forms built up, I moved onto the mid-level height information – creating the blown snow wind effect, and a tiered snow ‘swirl’ build up effect. The blown wind is simply a Vertical Noise node Directional Warped with a Clouds 2 node and then again with the ridges shape so the warps conform to the larger forms of the snow. I made the tiered swirls by taking the blown snow effect, Directional Warping it with the non-peaky areas, or troughs, of the height map (inverted, blurred version of the Ridges shape). This creates the effect of the wind swirling around the peaks, ‘butting up’ against and flowing around the ridges, depositing the snow in layers. I then ran this through a few more Directional Warp nodes using several noises and a warp input mask made from warping several cell nodes together – this was to add smaller breaks to the swirls and remove any overly procedural look – introducing chaos and breaking uniformity are key to creating natural looking materials.
The swirl ridges where then blended into the main heightmap, masked so they appear mostly in the higher ridge areas where the build-up would occur.
From here, I wanted to add some undulation to the snow surface. From looking at the reference and the behaviour of the snow, I knew I wanted to add some ‘peaky’ undulations, perhaps where the wind had whipped up small peaks etc, as well as a noisier version suggesting areas where the snow had slightly clumped together. The peaked undulation was created by running an inverted Cells 1 node through several Direction Warps with different noises, blurring the result and blending it back on itself to create more fall-off from the peak. This was warped again several times with more noises, before being blended in with the main height map at low opacity. The noisier undulation was made by running a Clouds 1 node through several levels, Slope Blurs and transforms before blending it with the previous ‘peaked’ undulation, which was fed into a Slope Blur Greyscale, for a subtle natural build-up of variation and surface detail. It was then blended with the main height map at low opacity. Even though the opacity is low, it has a big impact on the height map; even subtle differences can totally change the look of your material.
Next, I added in more wind-blown lines in the snow, using the previously generated lines, warped slightly by the peaks in the height map, and masked so they are present in the flatter areas but stronger around the ridges. Having the wind lines straighter suggests that the wind was strong, blowing fast and scouring the surface, whilst having the greater influence at the peaks suggests these areas were more exposed to the winds.
Subtle, soft undulations were added next, using a tweaked version of the technique within Joshua Lynch’s great tutorial. Various noises were levelled, blurred and blended at a low opacity with a mid-grey. When blended back into the main height using Add/Sub, this created very effective soft areas of undulation, hinting at forms underneath the snow build-up; rocks, terrain, grass clumps etc.
Height map creation process
The micro surface detail pass is final stage of the height map, and very important. I used the previous swirl ridge height warped with noise to create subtle micro detail in snow. For the finer surface detail of a material like snow, there’s nothing much other than Fractal Sum Base that will get you that super-fine detail. I used several of these, warped by the Height map, scaled to give even finer detail, and blended at very, very low opacities. Then Dirt 6, scaled, histogram scanned for contrast and blended again at a very low opacity. The overall effect is incredibly subtle, but extremely effective at conveying the materials’ surface.
To create the sparkles you see in snow, I used two tile samples, one with ‘Pattern’ set to Gradation, one with the pattern set to ‘Disc’ with varying amounts in X and Y, blended together using multiply to create a more random, less procedural look. ‘Gradation’ input creates scattered tiny gradients, adding a directionality to the effect – this will give the effect of each ‘sparkle’ or snow crystal reacting to light as it rotates, or at different camera angles. The ‘Disc’ pattern input gives shape to the gradients, which would otherwise be square/rectangular. This process was repeated several times at different scales to create larger flakes and smaller ones for more variety. These were then inverted and fed into the albedo and roughness at various stages.
The albedo/base colour texture is very simple; The height map is gradient mapped to some off-white and slightly blue-ish white colours, then corrected using HSL (Hue/Saturate/Lighten). I used several HSL nodes to slightly brighten the peaks, and to add a very subtle icy blue to the troughs, using levelled height map and tweaked ambient occlusion respectfully as masks. The ambient occlusion is made with a Curvature Smooth from the Normal Map, levelled and blended with two standard Ambient Occlusion nodes with different values. It is then run through a Histogram Range and Blur HQ Greyscale node, to ensure the effect is very, very subtle.
The roughness tends to be the last part of the material I work on, as it usually draws from various elements of the rest of your material. In this case, the height forms the basis, which is blended with a fine noise. I then blend in the troughs of the height map, set to Add/Linear Dodge, to even up the contrast between the peaks and troughs, whilst giving me a darker edge around the flatter areas. I then corrected the levels so the distinction between the two areas was way more subtle, and finally added the sparkles. The thought behind the flatter areas being less rough was to suggest that more fresh snow was being deposited or ‘caught’ on the ridges and peaked due to the wind, whilst the flatter areas, scoured by the wind, would reveal a slightly more compacted frozen snow layer underneath. The effect is very subtle, but again adds slight variation and helps with realism.