Simon Telezhkin explained how he created an ice cube for the annual Nodevember challenge, showing how he set up the shape, the internal fog volume, the bubble scattering, and the droplets, and then shaded each part.
Introduction
Hi, I'm Simon Telezhkin, a 3D Artist with a little over 20 years of experience in CG. I started with 3ds Max 4.2 back in the early 2000s, and since then, 3D has stayed my main way of exploring the world.
I've always leaned toward learning new tools and techniques rather than settling into a narrow specialization. Over the years, I've picked up most major CG packages, but these days my main workflow revolves around Blender, Houdini, and DaVinci Resolve.
I've worked as a generalist in small teams, jumped between different visual styles, studied industrial design, built interactive museum models, made social-network games, worked for Parity as an NFT artist for a couple of years, and done plenty of freelance work. Now I'm mostly focusing on exploring Houdini and VR out of pure curiosity and enjoyment.
This ice cube was created for Day 3 of Nodevember, and it's actually my first serious attempt at doing a "one artwork per day" challenge. Most of my personal projects live anywhere from several months to several years, and many never get finished at all. So signing up for Nodevember felt like a way to break that pattern and inject a bit of chaos and speed into my routine.
As I'm writing this, I'm on Day 16 of the challenge, and I can say with confidence: producing a complete piece every day is much harder than I expected. I'm still not sure I'll finish the whole month, but even now the process has forced me to make decisions faster, simplify aggressively, and stop polishing too early, all of which are valuable skills.
Ice Workflow
Before touching Houdini, I looked at a bunch of real ice references. A few things immediately stood out:
- Edges are never perfectly sharp, there's always subtle rounding and melting.
- Internal bubbles tend to be clustered around areas with less density.
- Ice has a slight milky scattering layer, not just transparency.
These small details gave me a direction for how complex the internal structure should be and what kind of micro-variation the surface needed.
One of the biggest strengths of procedural modeling is the ability to reuse and mutate previous networks instead of starting every project from zero. Some time ago, I followed an Entagma lesson on creating a quartz crystal in Houdini, and I also remember Arvid Schneider doing a similar tutorial.
That entire "semi-transparent crystal with internal noise and structure" problem is already very close to ice.
- So I used the quartz setup as a conceptual base:
- Rebuild the core crystal logic.
- Replace the shape with a cube.
- Add internal bubbles.
- Add droplets on the surface.
- Rework shading.
- Move everything into Solaris and render with Karma.
This ice cube ended up becoming my first-ever Karma render, which made it a perfect opportunity to finally stop avoiding Solaris. The entire setup is actually very standard, nothing exotic or overly clever:
Shape Generation:
- Start with a cube.
- Add subtle bending and irregularities to avoid perfect straight edges.
- Apply a mild fracture to create internal structure.
- Use noise masks to define where the fractured pieces blend and fade.
Internal Fog Volume. This adds the characteristic milky "glow" inside the ice:
- A low-density VDB.
- Noise to break up uniformity.
- Mix an additional 3D noise on top of the previous one.
Bubbles were scattered procedurally based on where the fog is thinnest. Logic:
- Subtract the vdb volume of the cube and vdb for fog.
- Place bubbles in the volume.
- Create a difference in the scale attribute of bubbles to avoid repetition.
- Flip normals and merge with the highpoly, no need for booleans.
Droplets on the Surface. A simple scatter + copy-to-points setup:
- Add noise mask. Vary droplet scale randomly with scatteralign node based on mask.
- Copy spheres to points.
- Subtract vdb of the original cube.
- Slight blurring.
- Most of the droplets would disappear, but it's fine.
Shading
Ice Material. I built the main shader from scratch for Karma. Key points:
- High transmission but not pure transparency.
- Slight subsurface-like scattering inside the shallow volume layer.
- Triblanar grunge map with high contrast on reflection_gloss.
- Do not overdo dispersion. It's pretty, but ice is not a diamond, and the dispersion is close to invisible in ice cubes. I put a 100(bigger number means more subtle effect here).
For the water droplets, it's just simple water material. For the internal fog, it's
Karma pyroshader. I'm completely unfamiliar with how any of this works, so I just played with numbers until I liked the results.
Lighting, Environment & Rendering
For ice, lighting does most of the heavy lifting:
- A couple of hardback lights from different sides.
- Some dim subtle HDRI for reflections.
- A subtle side light to shape the surface so it wouldn't look flat.
- A dark background so edges read clearly.
This was my first time rendering in Karma, so I had to figure out a lot on the fly. It's complicated to start with, but if something can be made with nodes, it's a win in the long run. It's so easy to copy and paste preferences from previous projects as node trees instead of a bunch of parameters.
It's so easy to have different sets of settings that can be stored and just put aside, it's worth it. I was surprised how fast it works. Every frame is rendered in half a minute. Made a simple animation with "30*sin($FF/$FEND*180)" expression on the rotation Y. It turns the object 30 degrees to one side. I then copied the rendered frames, reversed the speed so it'll loop.
The post-processing in DaVinci was very minimal:
- Gentle contrast.
- Slight tone shift toward cooler highlights.
- Simulated additional blue noise as a grain effect so it'll look like a film instead of a render.
- I also made the center of the icecube much more exposed.
- Sharpening at the end.
Approximate time per stage:
- 2 hours building the procedural system.
- 2 hours figuring out Solaris/Karma properly.
- 1 hour rendering and rerendering.
- 30 minutes on color and final touches.
- 1–2 hours of pure art direction: nudging parameters until it looked right.
My main advice for creating convincing materials: don't think about the shader in isolation. The perceived quality of a material comes from a combination of things:
- How the light travels through the object.
- The kind of structure and detail the object has inside.
- How you set up the environment, light, and color around it.
You can have a technically correct shader, but if the interior is empty and the environment is flat, it will still look fake. For ice, the tiny bubbles, micro-chips, soft rounding of edges, and subtle color shifts in the shadows all matter a lot more than one extra slider tweak in the roughness.
As you add elements to the scene, each one improving the image by maybe 10%, you have to increasingly rely on intuition. The typical workflow is:
- Modeling and procedural setup.
- Shading and lookdev.
- Rendering.
- Post-processing.
With procedural modeling, you always have the option to go back and adjust earlier stages, but that still costs time and attention. So it's useful to have at least a rough mental model of what will actually help the final image and what's just noise.
This is where "from A to Z" tutorials aren't that helpful. For example, when I add subtle bends and irregularities to a cube that's still just a gray material in the viewport, I already know that this will improve the reflections and highlights later. That understanding lives in my head, not in the current frame you see on screen.
One thing I find useful is to look at the finished render and then systematically disable whole blocks of the setup to see what they really contribute. If you remove the droplets, if you kill the bubbles, if you straighten the edges, if you turn off one internal mask, how much worse does the image actually become?
Not all changes are equal, and this kind of comparison very quickly shows which parts are essential and which are just "nice to have". I made some GIFs to compare how much influence the final different additions had. Here is the final result:
Here I removed the light that added more shape (turned out it's unnoticeable):
Removed one of the back lights:
Removed all the light except for the HDRI:
Removed reflection gloss triplanar Grunge Map:
Removed SSS and transparency depth:
Removed droplets:
Removed internal fog:
Removed bubbles:
Removed internal split:
Removed basic cube surface imperfections:
Removed post-editing and color correction in DaVinci Resolve:
Conclusion
This project wasn't about inventing new techniques. It was about:
- Using an old procedural idea in a new way.
- Forcing myself to work under a one-day deadline.
- Finally pushing a full project through Solaris and Karma.
If you're into procedural workflows and need some professional help with procedural systems like Houdini or Blender nodes, I'm always happy to talk or exchange notes. Feel free to reach out through any means. Here are my Twitter and ArtStation pages.