Create a High-Poly Snow-Covered Tree in Blender
Tutorial written by Thomas Cairns.
Written for Blender 2.74

Download the basic version of the completed tree here.
Download the scene above here.  (High poly count)
Textures used in this tutorial can be found from cgtextures.com and are not included with the .blend files

Overview

In this tutorial we'll go over the process of taking a complex model outputted from a tree generator such as Blender's Sapling addon and creating a snow model to coat it, without modeling the snow manually.  We'll also get to use a few of the less commonly used nodes and modifiers in Blender that you may find useful in other applications besides adding snow.  Specifically, we'll get to see one way of using the:  
  • Geometry node
  • Separate XYZ node
  • Mask modifier
  • VertexWeightMix modifier
 Our result will be most useful at a medium-long range distance as shown in the render above, since at very close distances it would require a massive polycount to get the required detail for so many branches and leaves.  Since we are going to be using a fairly detailed tree, the final polygon count will be approximately 100,000-150,000 triangles at the lowest subdivision levels. 
Preparation

  • Enable the Sapling addon under user preferences.
  • Switch the renderer from Blender Render to Cycles Render
(Optional):  If you would like to skip the process of generating the tree prior to snow being added, you can download a copy here.

Generating the Tree

  • Add a Sapling Addon tree to the scene.
  • The above settings resulted in a reasonable looking snow-covered tree  
Note: Bevel and curve resolution are set low in the sapling generation since subsurf will be later used  to smooth out the model.   Using subsurf allows us to have the option of later reducing polycount by disabling subsurf when not necessary, useful for trees further in the background.

Generating the Snow Mesh

  • Add a new material to the tree and set up the material nodes as shown.  
    • The geometry and separate XYZ nodes will result in the faces with normals pointing upwards being differentiated from the rest.  We will later use this to generate the snow since snow will be resting on only the top-facing parts of the tree.
    • The color ramp will allow us to adjust the effect.
    • The diffuse and emission shader will help us to see the effect in preview renders so that we can see what we are doing.
  • Switch the viewport shading to "Rendered".
  • Adjust the color ramp so that the model looks similar to the above.
    • We will use the material to separate a part of the tree for snow to be its own mesh, so anywhere that should have snow should be solid white.  Avoid grays much as possible at this stage.
    • The trunk of the tree will remain black since its normals do not face upward.
  • Select the tree, turn off any subsurf modifiers, and convert it to a mesh.  
    • You may want to duplicate the mesh and move it to another layer as a backup.
  • Select the leaves and hide them (hotkey H)


  • Open the UV window, add a new image and give it a name.

  • Select the tree trunk and separate it from the rest of the tree (hotkey P > selected).  
    • This will save UV space and allow more accurate displacement for the snow.
  • Go into edit mode and unwrap the tree with Smart UV project as shown above.

  • Go into the node editor for the tree material
  • Add a new image texture and assign the image that we made earlier.

  • Select the image texture node and then go to the properties window.
  • Change bake type to Emit.
  • Click bake.
    • This will take the black and white material and bake it into an image that we can then use to make the snow mesh.
    • The emission material will appear as white, while the diffuse material will appear as black.
    • The result of the bake should look similar to the above right.

  • Duplicate the tree and hide it (hotkey H).  
    • It will later be used as the wood of the tree.  
    • The original will be turned into snow.
  • Add a new vertex group to the original tree mesh.  

  • Add one level of subsurf and then add a VertexWeightMix modifier.
    • The VertexWeightMix modifier is going to take our black and white texture that we baked earlier, and assign all of the vertices that lie on the white (high intensity) colored areas to our new vertex group.  
  • Set up the settings as shown above.
  • The Texture Mask should be set up as shown on the right.  Choose the image that we baked earlier for the texture.

  • Lastly, add a Mask modifier and select the vertex group that we made earlier.  
    • The mask modifier is going to take the altered vertex group from the VertexWeightMix modifier and get rid of anything that isn't in that vertex group (anything that was black on our baked texture).
    • The completed modifier setup is shown above.
    • The result of this step is shown on the right.  Only the areas that appeared white in the material setup should be showing.
  • Apply the modifiers starting from the top and going down to the bottom, in order.  
Note: The order of modifiers is important!
  • Go into the material nodes for the snow mesh and adjust the color ramp this time so that instead of mostly white or black, there is a gradient of values.
    • Later, white will be taller piles of snow, and lower value colors will be shorter.  Ideally the small ends of branches should be dark gray while the thicker parts remain white.  
    • My color ramp adjustment is shown on the left, and the result on the right.  

  • Again, we will bake this material to an image using the same process as before.  
  • We can bake it to the same image that we used to separate the snow from the tree mesh since we no longer need it, since we've already separated our snow from the rest of the mesh.
  • This time, however, we save the newly baked image.

  • Adding a subsurf modifier here is optional, but will give slighly better looking displacement.
  • Add a displacement modifier to the snow mesh as shown above.
  • Make sure coordinates are set to UV and that the texture is set to the one we just saved, as shown in the left and middle images.
  • Once you unhide the tree mesh that will be used as wood, it should look similar to the image on the right.

Material Setup


  • For a basic snow shader I used a 50:50 glossy and blue transparent shader as shown above.

  • For a very basic wood shader I used only a diffuse shader with a tileable texture of bark with spots of snow on it.
    • Since we unwrapped the whole tree (except the trunk) earlier, the wood mesh should already have UVs ready for textures.
  • Unwrap the tree trunk, join it with the wood tree mesh, and add your tileable snowy wood texture.
    • Adding a single seam along one long, vertical edge and unwrapping will work fine for the trunk.  SmartUV will also work.  Cylindrical unwrapping will work if you change your viewport to front-view.
  • For a basic leaf shader I combined a transparent and diffuse shader with a black and white alpha map of a leaf.
    • Since most downloaded leaf textures will be very  green, they can be desaturated with the Hue Saturation Value node to better fit with the winter-time setting.

Final (optional) Adjustments

  • At this point the snow resting on the branches will look fairly light and flat, so if we want thicker or puffier snow we can do the following:
  • Add another displacement modifier to the snow mesh with midlevel set to 0 and with the same texture as the previous displacement modifier.  Adjust thickness with the strength value. 
    • We cannot use the original displacement modifier because that first modifier is displacing geometry based on normals that are mostly facing straight upwards in the positive Z direction, so adjusting strength will only make the snow go taller.
    • When we use a new displacement modifier placed immediately after the original modifier, it displaces geometry based on the normals of the displaced geometry from the previous modifier, allowing the mesh to become thicker in all directions, rather than mostly in the Z direction.
  • If some branches have no snow and you would like there to be some, we can add another displacement modifier with midlevel set to zero and no texture applied, and set it to a low strength value
    • Since there is no texture, all areas of the snow mesh will be displaced by the same amount, including those places where no snow was showing.
  • If there is not enough density of branches and snow in the tree, we can duplicate the branches and snow and rotate them around the Z axis.
    • This will dramatically increase the poly count.
  • If you want the tree to be bent as if there were strong winds, a lattice modifier can be applied to everything on the tree at once and then adjusted.