Building an Ice Cave in UE4

Jamir Blanco did a detailed breakdown of his frosty environment. Learn the details of sculpting, texturing, baking, particle usage, and lighting setup.


Jamir Blanco did a detailed breakdown of his frosty environment. Learn the details of sculpting, texturing, baking, particle usage, and lighting setup.


Hello! My name is Jamir, I’m a 3d environment artist working in the feature film/game industry. My recent work, “Ice Cave”, is a personal study I made for fun using Maya, ZBrush, Substance, and UE4. The intent was to familiarize myself some more with the game engine and produce a high-quality real-time environment that looked good from several angles.

If you’re interested in viewing the one-minute high-resolution scene capture, you can watch it below.

Anyways, let’s get started!

Gathering Reference

I knew I wanted to create an Arctic space, so I searched and found lots of great images. I found this interesting image with lots of shapes and cool lighting going on, so I challenged myself to create something similar in Unreal.

I began dissecting the reference image and taking mental notes of what elements are similar to each other. The idea here is that for each element, I really only have to make one modular asset that can be duped around.

Something that really helps being efficient is keeping in mind the differences you see from similar assets in a reference. That way, when you go to model, you can just copy those differences onto another side of the model, and then you have a lot of room to re-use a single asset as much as possible. I did this for all the props in my scene.

List of Modular Assets:

Icy ground rock: x1 (will dup around)

Ground: x1 (seamless tileable sculpt or material to use as surface for plane)

Icy pillar: x1 (highlighted in purple)

Cave wall: x2 (enclosures of the cave)

Snow building up: x1 ( snow seems to be present around areas)

Icicles: x3 (three prominent variations seen in ref)

Making an asset list and checking them off as I go helps me stay focused and on track, making the process much smoother and more efficient.

Scene Blockout

I began by blocking out the scene in Maya. This was just a quick and rough layout where I can play around with composition, shapes, and lighting. I can go in and duplicate, group, scale, and really just start trying to understand how this environment will assemble together once the pieces are there.

From Maya, I don’t export the entire scene to Unreal, but it helps me establish the space and the number of assets I will need to make. If I had laid out the blockmesh to something I really want to adhere to, I could potentially export the scene as an obj and use it as a guide inside Unreal when I start laying out the final assets.

Once I had a solid understanding of the layout and assets that needed to be made, I began the modeling phase. Exporting the blockmesh to ZBrush, or quickly making a new base in ZBrush and starting from there, I started modeling and sculpting assets based on the reference.

Building Assets

All modeling was done in ZBrush for this project. I began by importing the blockmesh created earlier, or just starting with primitives / dynamesh workflow. There weren’t that many different brushes I used, but the techniques did vary a bit from object to object.

For the ground, I knew it would eventually be a tileable material so they key technique here was to ensure a tileable sculpt using Wrap Mode in the brush settings.

Before beginning to sculpt, I saved the initial state of the high-res plane using Morph Target. This way if I accidentally sculpt without Wrap Mode on, or if I simply don’t like an area, I can always use the Morph brush to erase any sculpting done and bring back areas from the initial Morph Target.

The ice shards and stalactite were created using dynamesh workflow. I started by creating the more simple ice shard first. This one was approached by starting with a sphere and using the Move tool to manipulate the mesh into a single shard-like shape; dynameshing when needed. When I had a good solid foundation, I began using the hPolish brush in combination with Pinch and Trim Dynamic to achieve a sharper more accurate model representation.

After creating the single icicle (which was exported to be used as a modular asset), I reused it to create the more complex stalactite. The first step was to create a more accurate surface to resemble the features of a single small stalactite shard. To do this, I used NoiseMaker to create a surface mask that was then used in combination with the Inflate Balloon deformer.

Once I was happy with the result, I created a Nanomesh brush out of the new stalactite shard. Before creating the insert mesh brush, however, I decimated the geometry so that the Nanomesh process would not take a huge toll on my system’s memory, since it involves a lot of duplication and ZBrush will literally try to place the heavy geo onto every polygon of your base.

After initializing the setup, I used the parameters in the Nanomesh subpalette to achieve the final result. I used Random Distribution at a really low number to break up the scatter into a much more realistic layout so that not every poly face has a shard sticking out of it.

Secondly, I made use of all the variation parameters to give each nanomesh instance a random scale and rotation, as well as depth. Using this method, I was able to quickly generate a modular piece I would then use in Unreal to layout a stalactite layer over the entire cave roof. The process of getting the final sculpted models out of ZBrush was really easy, I just made sure to export the highpoly, as well as a low poly, decimated version of each asset.

UVs, Baking, Texturing

Before exporting the low poly, I gave the mesh UV’s using UV Master plugin. It can yield really nice and fast results if used correctly. There is a little bit of manual work involved, but for the most part, it’s pretty easy and works well.

I broke the model up into polygroups which would essentially become my UV shells. The polygrouping informs UV Master the logic in which you want UVs broken out in. Thanks to ZModeler and select lasso, it is very easy to create these UV shells based on simple selections.

Since the mesh is decimated as well as organic, it is very easy to get seams in areas you don’t necessarily want. Using the zModeler brush set to “polygroup” by polygon selection, you can easily go in and refine the edge of each UV shell to something more desirable.

After unwrapping the UV’s, most of the time they will be rotated in weird angles and not laid out very well. To clean this up, I simply flatten the UVs and arrange them in a more appropriate and usable layout using the transpose tool directly on the uv shells. After the low poly model has some UVs, I export and bake all the high poly detail, and do this for each model.

I used Substance Designer and Painter to bake down all the information from the high poly assets to low. In particular, the thickness map option was left on since I wanted to use this information to create a sub-surface scatter effect where light transmission would happen.

The roughness maps were created using procedural nodes to create micro-detail such as water melting towards the crevices of the ice. To only have melting water building up on the flat surfaces of the icy rock, world-space normal maps were used as a mask for anything facing the Y axis. Additional information was also introduced into the normal map to create more interesting and rich results.

Prepping Assets in Unreal

After texturing each asset, I then loaded them into a basic Unreal scene. I used this scene as a unit to check-in my assets, connect all the texture maps and materials, and make sure that everything is working well together.

Unreal makes it super easy to look develop and test your assets under different lighting setups. By double-clicking the asset after importing it into my project, I can set up its default material, view it under different lighting scenarios, and make sure everything is working properly.


The material set up inside Unreal Engine was very easy since most of the information is coming from pre-determined maps and textures created earlier. For the ground, I made sure to enable tessellation and set that material to use VertexNormalWS multiplied by the power of the height map.

Scene Assembly

Once I had all the pieces ready, it was time to go in and just start laying stuff out. This is where scoping the required assets and making them as modular as possible really pays of. Unreal is great with file handling and really smart about the way the engine loads assets, making it very easy to artistically approach scene assemblies.

The large cliff formations in the background is a great example of kitbashing assets that I made for the cave interior, rather than making additional unique background cliffs. It is essentially the same exact model of the icy rock; just duplicated, rotated, scaled, and bashed together several times to create a new, larger rock formation that served as a building block for background stuff. Since all the sides are a bit different, it saves a ton of time since I can use the asset in many different angles and create interesting variations simply by rotating and kitbashing.

As you can see from the general layout of the environment, I only built certain sections, mainly based on where I knew the camera would be and what areas it could see. Doing so allowed me to quickly establish the set in minimal time. As areas started to develop, I would decide if it was worth the time to extend and continue them or just build them to a certain distance. For the most part, I only fully built the cave interior where I knew the cameras would be in. For the exterior and background, I mainly built them after creating cameras and placing them.


Lighting was something I already had in mind since the early stages of the environment. I really wanted to play around with the idea of a mystic feeling arctic space, and I knew lighting would play a big roll in this. Therefore, a lot of the look development and tests happened around the idea of glowing ice, or light scattering through the surface. Using the emissive slot of the material, and the baked thickness information of the model, I was quickly able to create a theme and style for the environment.

The scene lighting was a pretty simple setup. the sunlight coming in from outside was the main source, and a spotlight was placed at the entrance to emphasize directional lighting. There is an additional spotlight inside the cave, and this was used at a low value just to get some more rim light and interesting shadows happening near the foreground.

A couple point lights were placed in areas that were still too dark, or just to give some point of interest to areas where I wanted the viewer to look.

And finally, a skylight was added to the scene, yielding a great overall global illumination effect. All in all, there were a total of 9 lights in the entire setup. After all lights were placed and I was happy with the overall look, I went ahead and added a Sphere Reflection Capture probe, which really helped the lighting sing.

This probe looks at everything within the given volume, lights and geo, and uses all this info to calculate realistic reflections for the set, adding really nice highlight values and more accurate scene rendering.

Particle Effects

In order to get effects like snow and wind blowing, I created a couple particle systems and played around with the settings inside Cascade until getting a nice flow for each element. For the snow, I generally left a lot of the properties at default, only changing the particle rate, initial velocity, and alpha over life.

The default particle rate of 20 is way too fast for the effect I wanted. Instead, I changed the rate to less than 2 to get a slower particle emission. The initial velocity was also something I played around with and increased the min / max values in order to get a more natural area coverage rather than a straight line.

The Alpha over Life was set to start at full opacity and fade towards the end of each particle’s life cycle, making sure there are no visual popping effects when the particle dies. You can only see the results once you apply a material to the system under the Required tab.

Afterwards, the material must be set up to use the particle’s color in order to be reflected both in game and in Cascade. The process is very simple though, and the effect is much more convincing and natural looking.

Afterwards, the particle system is placed in the scene near the entrance, and rotated to face and emit towards the cave. A similar approach was done for the blowing wind, except the material uses a smoke puff image with alpha cut out for the color, rather than a gradient.

Camera, Post-Process, Rendering

I used the “create camera here” command in the viewport dropdown to layout and establish final cameras. I basically walked around the open space and chose locations I thought looked cool and created cameras there to later make small animations.

For some of the shots, I wanted to have an animated DoF. Although the regular camera’s depth of field features are pretty good, they didn’t seem to play well with animated focus. To fix this, I replaced the cameras that I wanted to have more accurate DoF effect with cinematic cameras.

The cinematic cameras are really really cool and are treated much more like a physical camera. A major reason to use this camera is the animatable Manual Focus Distance. Using the color picker tool next to it, it’s super easy to select anything in the scene you want to be in focus. You also have some better controls for the bokeh as well as the option for smooth focal changes.

By using the Depth of Field Layers visualizer, it’s easy to see where exactly the focus is and how it changes based on tweaking the values and properties of the camera’s depth of field.

A really important element that helped with the final look was adding a PostProcessVolume to the scene, with Unbound checked on. This is probably one my favorite features in UE4, since it allows for dynamic overall changes such as Hue and Saturation, fine control of Screen Space Ambient Occlusion, Vignette, and much more.

I also played around with the auto-exposure, tonemapping, and screen resolution in the Misc tab of the PostProcess volume. This really helped push the colors and give a high quality cinematic feel to everything.

  • SSAO render.

And finally, the entire rendering was handled with UE4’s new Sequencer tool.

I was really surprised at how easy it was to set up each camera as its own shot, and pull them all together into a master sequence, where I can freely edit, cut, trim, and move everything around without any changes to the actual shot. Sequencer also allows for animated fades, as well as allows you to bring in audio to sync up and add to the final animation sequence. These tools were priceless when it came to rendering out the animation as I had in mind. The fact that it’s now so easy to just do everything inside Unreal, including the editing and transitions, really has me excited to use these features some more in future projects.


Aside from in-game post processing, no additional compositing or other effects were done outside of the engine; everything is 100% CG and rendered inside Unreal. The final 1 minute short animation I did rendered at real-time in 2k resolution.

So, that pretty much wraps it up for this tutorial. I hope others may find it useful, and can see just how easy it to create environments and render them out of unreal for your portfolio. If anyone has any further questions, feel free to get in touch regarding this project or just environment art in general, I’m more than happy to answer back.

Huge thanks to Kirill Tokarev and the entire 80 LEVEL team for putting this together.


Join discussion

Comments 0

    You might also like

    We need your consent

    We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more