Make Realistic 3D Ice in Blender (Procedural Shaders)

Nov 2nd 2022

Procedural shaders are a powerful but underrated tool in Blender. Today, we’re going to learn how to use them to create a realistic 3D cube of ice. Hopefully, this tutorial will be an effective primer for all of you Blender beginners, and you’ll be creating ice materials from scratch in no time. Feel free to follow along here, or take a look at the video version of this tutorial for a step-by-step deep dive into this process.

At a high level, the properties we’ll need to tweak to create some realistic ice are:

  • Shape
  • Environment
  • Texture

Let's start at the top.


We'll start off with the default cube. 😎

1-02 at 12.05.43.png

Now, in real life, ice cubes are never perfect cubes, so we’ll want to add some modifiers to give the shape of the cube more interest. To do this, first select the wrench icon to get to the modifiers, and then add a Subdivision Surface modifier, which is used to split the faces of a mesh into smaller faces.


The Catmull-Clark option will distort the cube and round it out, which we don’t want, so we’ll select the Simple option, which will remove the rounding effect but still increase the subdivisions. We can also increase the Levels Viewport value to 2 to match the Render value.

1-02 at 12.07.55.png

The next modifier we want to add is a Displace modifier, which displaces vertices in a mesh based on the intensity of a texture.


That gets us something like this.

1-02 at 12.09.17.png

We can click “New” to create a new texture for the Displace modifier and then select the “Show texture in texture tab” button, which will take us to the texture tab as shown below.


We’ll create a Clouds texture and bring the Size way up. The resulting shape of the cube is something like what’s shown below.


1-02 at 12.12.27.png

Next, we’ll go back to the wrench icon and change the strength of the Displace modifier to something closer to our desired result, like below.

1-02 at 12.13.02.png

Then, we can right-click and Shade Smooth to get something like this.

1-02 at 12.13.23.png

Finally, we'll add a Bevel modifier

1-02 at 12.14.11.png

We can increase the segments value of the Bevel modifier to 2, getting us something like the below image. As you can see, it’s starting to look a lot like an ice cube.

1-02 at 12.14.34.png


Our first step to getting the environment in order is to create a plane for our ice cube to rest on. Let’s hit Shift+A > Mesh > Plane.

1-02 at 12.15.00.png

We can then press S to scale the plane and G and Z to move the plane into position.

1-02 at 12.15.39.png

1-02 at 12.16.18.png

This will act as a floor plane for our ice to sit on so that we actually have something to see through the ice.


To start working on the opacity and transparency of the cube, let’s first split our view. Mouse over the left border of the view until you see the crosshair, and then click and drag right until the view is split in two.

1-02 at 12.26.15.png

In the upper right-hand corner, open the Editor Type selector and select the Shader Editor.

1-02 at 12.26.39.png

Now that we have the Shader Editor open in the left view, let’s select our cube, go to the material tab, rename our material to Ice—since that’s what we’re working on—and switch over to Rendered View.

1-02 at 12.27.28.png

The Cycles render engine is the best choice for this, but we’ll start off using Eevee for demonstration purposes. We have a number of settings that need to be set before we can make our cube transparent.

First, we’ll go to the options tab of our Shader Editor and change the Blend Mode and Shadow Mode to Alpha Hashed. We’ll also turn on Screen Space Refraction.

Then, in the Render Engine settings, we will turn on Ambient Occlusion, Bloom, Screen Space Reflections, and Refraction. These options can all be seen in the image below.

1-02 at 12.27.55.png

Now, to make our ice cube transparent, we can set the Transmission value in the Principled BSDF node to 1. This refers to how much light hitting the object is transmitted through, which in our case should be all of it.

1-02 at 12.28.19.png

You may be able to see at this point that, while all of the light hitting the object is being transmitted through, it is blurry. That is because of the Roughness value, which refers to how rough the surface of the object is which in turn affects the refraction of the light passing through. For our purposes, we can turn the roughness quite low for now, and we should see that the ice cube is behaving almost like a window that we can see right through.

1-02 at 12.28.41.png

Environment Part two

You didn’t think we were done with the environment yet, did you? We have the floor plane for our ice cube created, which is great, but the environment surrounding our scene here is a little blank—and since we’re able to see the environment through our ice cube now, we’d better have an actual environment to see.

To do this, first turn off the Scene World setting from this dropdown.

1-02 at 12.29.09.png

Next, let’s select one of Blender’s built-in HDRI environments. I’ll be using this one.

1-02 at 12.29.47.png

Finally, let’s take the world opacity up to 1 so that we can actually see our world.


Fine-tuning the bumpy texture of our ice is what’s going to really bring it to life, so let’s get started on that now. To do this, we’ll go to our Shader Editor and use Shift+A to add a Bump node, and then again to add a Noise Texture node. Connect Factor from the Noise Texture node to Height from the Bump node, and then connect Normal from the Bump node to Normal from the Principled BSDF node.

1-02 at 12.30.28.png

I know this is a lot of information, so I encourage you to check out the video version ofthis tutorial to see these changes in real-time.

For those who are unfamiliar, here’s how this pipeline works: the Noise Texture node generates a black-and-white 2D image that gets piped into the Bump map node.

The Bump node then interprets the noise that it’s fed as the height of the bumps on the ice’s surface, with white being peaks and black. It then translates those points into normals—which are simply the directions that a polygon face is pointing—and passes those to our surface.

We aren’t actually changing the geometry of our object, but the texture will be rendered convincingly enough to trick the eye.

I’ll then tweak the Scale, Detail, and Roughness values for the Noise Texture node and the Distance value for the Bump node to get the following.

1-02 at 12.31.04.png

Something else that will help make this ice look more realistic is breaking up the roughness a bit. Use Shift+A to add a ColorRamp node, and plug the Noise Texture Factor into the ColorRamp Factor. Then, plug the ColorRamp Color into the Principled BSDF Roughness.

1-02 at 12.31.30.png

This will have the same noise that’s affecting the bump texture and also affect the roughness of our cube.

Within the ColorRamp node, bring the blacks up and the whites down so that the ice is never perfectly transparent or perfectly opaque, but rather somewhere in the middle.


That will get us the following result

1-02 at 12.34.29.png

To really see how good our ice simulation is, we’ll want to switch over to the Cycles render engine, change our Device to GPU Compute, turn on Denoise, turn up our Max Samples to 3000, and turn our Noise Threshold down to .05.


Now that we can see what our ice will really look like, feel free to refine the other settings we’ve already set. I’ll bring our ColorRamp blacks just a bit higher.

1-02 at 12.35.52.png

Environment Part 3

Our floor plane is looking a little bland, and giving it some visual interest will really make our ice pop. Select the plane, navigate to the Materials tab, select New to create a new material, and drop the base color down to a dark color to provide some contrast.


We can also make the surface metallic by turning the Metallic property up to 1 and turning the Roughness down.

Texturing Part 2

There’s one last step we can take to get the ice material looking perfectly icy, and that is setting the IOR—the index of refraction. In the Principled BSDF node, set the IOR to the index of refraction for ice, which you can look up and find is 1.309.

1-02 at 12.43.46.png

And that’s it! 😅 We now have realistic 3D ice in our scene. Here’s our final result.


Hopefully, you found this Blender tutorial showing you how to use procedural shaders to make realistic 3D ice helpful. If you liked this, make sure to grab your CG Cookie subscription to stream 100's of Blender tutorials. 

Guest Author

Chris Bailey

Get the latest

Sign up with your email address and get the latest, straight to your inbox.