How to Create a Freezing Effect Using Blender's Geometry Nodes
mqleh shared how they created the Freezing effect, explaining how they used the model of a hand to design the effect, and how they achieved the smooth appearance of the smoke and ice crystals.
Introduction
Hi, I'm mqleh. I graduated recently with a bachelor's degree in visual communications. During my studies, I became interested in 3D art, especially procedural effects workflows and the incredible things people were creating with Blender's Geometry Nodes.
At first, Geometry Nodes felt intimidating and overly complex, but that only made me more determined to learn them. About a year ago, I decided to dive in properly. To seriously push myself, I chose Geometry Nodes as the central topic for my bachelor's thesis, and it was a really good decision because it forced me to really understand the system.
Since then, I've been experimenting with all kinds of procedural effects in Blender. In this article, I'll break down a freezing effect I did recently.
Freezing Effect – Mask
To showcase the effect, I decided to do it on a human hand. I started with a high-quality 3D model of a hand (from a human mesh I bought some time ago). The first step was to define the origin point for the ice growth. I manually created a vertex group and assigned it to the upper part of the forearm, which is the point where the freezing would begin and spread from.
After that, I jumped straight into Geometry Nodes to build the effect. First, I remeshed the hand to achieve an evenly dense topology. Then, using a Simulation Zone combined with a Blur Attribute node and some procedural noise, I built a spreading mask that grows naturally from the forearm down to the fingertips. The noise adds organic, uneven edges to the mask.
Smoke
Next, I began simulating the smoke points. First, I subtracted the previous frame's mask from the current one to isolate a thin front strip where new points spawn each frame. In the simulation zone, I spawned new points on each frame and accumulated them over time. I also defined several key attributes for the simulation:
- F (force): driven by a noise texture, plus slight upward (Z) and backward (X) forces to shape the motion.
- V (velocity): updated each frame by adding force, then stored as the new velocity.
- L (life): decays from 1 to 0 over time, controlling point size (shrinking) and eventual deletion.
- D (density): also decays from 1 to 0, used later to fade the smoke.
I then used the Set Position node with a velocity attribute to move the points.
To prevent points that spawn at the bottom of the hand from clipping through it as they rise, I added collision handling. By using the nearest surface normal and a dot product check, I pushed any points inside the hand back out and reflected their velocity to make them bounce realistically off the surface. I then also updated the velocity attribute to this new reflected one. Finally, the life attribute deleted old points and scaled them down over time.
To turn these points into volumetric smoke, I used the Points to Volume node and sampled the stored density attribute that I created before in the simulation zone, into a grid that I later used for making the shader.
Ice Crystals
To make the crystals, I first blurred the main mask attribute for a smoother transition (so crystals would grow gradually rather than instantly spawn in). After that, I distributed points across the hand's faces, then deleted most of them based on the blurred mask combined with a noise texture, which created natural-looking clumps of points instead of uniform coverage.
Next, I instanced custom crystal shapes on the surviving points (cone primitives slightly distorted with noise for variation) and aligned their rotation to the hand's surface normals and scaled them according to the blurred mask with noise texture, so they grow progressively as the mask advances.
Materials, Lighting, and Rendering
For the hand material, I used PBR marble textures from ambientcg.com, mixed via the blurred mask with a custom basic ice shader that uses high transmission and some noise-based bump and Roughness.
To make the smoke material, I used a volume shader driven by the custom density attribute, with a bit of emission for extra glow and visibility. For the ice crystals, I used a similar transmissive ice shader setup that I used for the hand material.
I lit the scene with an HDRI from polyhaven.com and two simple area lights (white and a slightly blue one). Everything was rendered in Cycles at 24 fps to a Multi-Layer EXR, followed by basic compositing, where I added some glare, lens distortion, and chromatic aberration for a better look.
Conclusion
If you're just starting with Geometry Nodes and want to create impressive effects, my advice is to begin with tutorials or, better yet, watch livestreams where artists explain their process in real time. There are a lot of amazing channels on YouTube teaching Geometry Nodes. Some of my favourites are CGMatter (also Default Cube), Cartesian Caramel, and Albin Merle.
Once you grasp the fundamentals, in my experience, the best way to learn is to pick an effect from your favourite movie, TV show, music video, or artwork, break it down, and try recreating it from scratch in Geometry Nodes. If you get stuck, search for tutorials for the specific problems you have or ask others for help in communities like blenderartists.org.
If you'd like to see more of the effects I create, you can find me on YouTube, X, and Reddit. Thank you for reading!