Skip to main content

Your Friend, The Ice Texture

Prophet's Mapping Tutorials

1. Introduction

Hello boys and girls. Today Papa Prophet is going to show you a few things from his magic bag of mapping tricks. In this tutorial you’ll learn:

  •     how to make the most of your Ice Textures (and learn why you want to know what an Ice Texture is)
  •     how to make the most out of your basic Unreal Engine 1 water using good old fashioned BSP
  •     how to compliment your map with rich shadows of the highest detail
  •     and lastly, how to utilize a much ignored natural feature of Unreal Engine 1.0 called the Macro Caustic.

This is going to be an advanced tutorial intended for those of you already familiar with making your own maps, and I’ll be operating on the assumption that you know the basics. These tricks will work on either UED 1.0 or 2.0, and can be applied to maps in Unreal as well as Unreal Tournament. Furthermore, all of these skills will work in all extended Unreal/Unreal Tournament editors, whether you’re using the enhanced Unreal 227 editor or the Nemesis Editor for Unreal Tournament. The only warning here is that I cannot guarantee how the results might vary in non-vanilla UE1 platforms, so keep that in mind.

Okay then. Let’s make some music together.


2. Getting To Know The Ice Texture and The Wet Wave

I’m going to start with the Ice Texture because it’s the one we’ll be spending the most time with. It’s also good to get this out of the way because it is the linchpin that will tie everything in this tutorial together.

Almost everyone that’s opened the editor has tried at one point or another to mess around with custom textures. Either we’ve imported our own sets into MyLevel or used custom packages to make our locations seem a little fresh (how many times can we honestly make a temple that looks like Chizra?). In both cases we’ve probably tried making “New” textures with the browser option. At least…you should have tried this already. If not, stop reading and go spend a good forty minutes making silly masked Fire Texture art in UED. I’ll wait.

You’re back? Okay. What you’ve either just figured out or knew already is that UED has its very own custom texture creation tool, albeit a little basic. At the default function, assuming you click New in the texture browser, UED will prompt you with the usual “name that package, group, and texture name” roll call with the bottom section set to Fire Texture as default. What you’ll see next, after generating the new package (if you haven’t done so already) and its first texture, is a black box in your MyLevel/Custom package. It will look like a masked texture without anything on it. When you go into its properties you’ll be able to select a variety of options under the Fire Paint tree to trace your own shapes. Typically, you can use this as a way to make your own torch flame textures or your own animated smoke, ect.

And if I gave a Shitake Mushroom about teaching you Fire Textures this would all be really important, but for this tutorial we will not be interested in any of this. Rather, it is the Fire Texture’s relatively unknown step sister the Ice Texture that we will be focusing on. Instead of going with the Fire Texture by default, by clicking the tilde on New texture prior to generating one you can scroll through the other options and create an Ice Texture. In place of Fire Paint you will instead see Ice Layer when you right click the New texture for its properties.

For this tutorial there are some things I want to show you about Ice Textures that will make you flip the hell out because we will need them for the Wet Wave, the Multi-Layered Liquid, and the Caustic. Now, as I explain all of this I’ll be using examples from whatever active map I’m using for my examples and will show screenshots and animated gifs of what I’m doing to get the point across. I would suggest that you open your editors and construct your own rooms using the dimensions I provide for the important stuff as you read this…

…But before we get too far ahead of ourselves, you will need a few things in the course of this tutorial that you can’t exactly get from stock Unreal/UT packages. In fact, to properly perform all of these effects you will have to be prepared to get your hands on some custom textures or familiarize yourself with programs like Gimp or Photoshop (in this mapper’s opinion, Gimp is easily adequate for what we’ll need here). If you are unwilling to go outside the box here and don’t have a better method than these then I hope you have fun with making water in Unreal like you’ve been doing since 1998. Yes, you can borrow from stock to fill all the necessary gaps along the way. Yes, they will probably look like shit. We’re trying to unlock the hidden potential that’s always been present in UED, remember? But that doesn’t mean all the tools to carve them out are readily available within old Ed himself. You have to remember that the reason you may not have heard about these tricks is because Epic never used them in Unreal, and Legend—for that matter—never used them in Return to Na Pali. Thus, the appropriate textures for them are simply not present in the stock packages. You can use stock surrogates, rest assured. They are there. But to get the most out of this tutorial you really need to be willing to make your own or get a reliable texture artist to help you out.

With that said…

One bit of customization you need is a Bump Texture, which is necessary to get the Wet Wave just right. That is the first thing we’ll be doing. I call it a Bump Texture because it’s trendy, but essentially we’re talking a simple grayscale image. You might actually find an acceptable one somewhere in the stock packages, but for the sake of this tutorial I will provide a custom one lifted from a Residual Decay package, provided by a fella named Dean that I know (aka the Unreal Architect).

Download Link: UnrealSP.Org

Check the download link and MyLevel this puppy. Or Custom package it. Whichever. It’s a basic, uncomplicated Bump, and it’s ones like this that are best for most kinds of Ice Textures. If you prefer, it might be prudent to make your own.

Okay, now that you’ve downloaded it we can make an effective Wet Wave. You’ll notice there is already an option for a Wet Texture when making a New texture, but oddly enough the Wet Texture doesn’t do for us what the Ice Texture will. All right, now I’ve wasted enough time getting you started. Let’s dive right into it, shall we?

You’ll see my room in the pic above. It’s about 512 by something or some such, but what really matters is that on the floor you’ll see that I’ve made a very shallow pool that’s 16 units deep, set in a square subtraction of 128 by 128 units. It really doesn’t matter if your room is sexy or not, or how big it is. Just get the dimensions of the pool right and include a light source and we’re solid.

What you’re going to do now is pretty easy and it’s what you would be doing normally. We’re going to make the pool. Now, you don’t have to actually use a water zone because we’re focusing on the cosmetics here, but you’ll need to add a sheet for the water surface as per usual and select a texture for the floor of the pool. As you can see in my shot below I applied a basic translucent sheet with an animated water texture, and beneath it you can see the texture of the pool floor.

Okay, now normally you’d be done right? This is how water looked in Unreal, so it’s good enough for me! Well what if I said that you could animate the floor under the water as the animated surface does, simulating the distortion of how the interior of a small pool or fountain might look?

To do this is…a bit interesting, since we won’t actually be doing anything to the water sheet or the zone itself. In your MyLevel/Custom package, make a New Ice Texture and go into its properties. Under the Ice Layer tree you’ll see a space for your Bump to go (the slot is called Glass Texture; don’t ask, I couldn’t tell you what Epic originally planned this feature for) and a slot for something called Source Texture. These two slots are mandatory for this to work. Import your downloaded Bump into your MyLevel/Custom package if you have not already and put it in its proper place in the Glass Texture slot. Then you will have to put whatever floor texture you selected for the bottom of your pool into the Source Texture slot. For example, mine is a custom tile. Now, this bit is kind of crucial, as you’ll learn soon that what we’re doing won’t work so well if you select a floor Source that is meant to tile. That doesn’t mean tile, as in a tile floor. For example, using any standard grated floor will likely not work, as they are meant to tile indefinitely, whereas a floor texture made up of a square design may not. You may have to mess around here to find one that’ll fit. You’ll know your selection is wrong when it won’t go into the slot…or will just look nuts when you apply it (think horribly skewed). But if done right...

Right away you should see your New Ice Texture is there in the viewing preview and it should look just like your Source Texture, as mine does in the example above. Now we need to mess with that last thing that’ll put it all together.

Right click on the Ice Texture and make these adjustments:

Do you see where it says PanningStyle under Ice Layer? By default it should be set to SLIDE_Linear. Change that to Slide_Circular. Immediately you will notice that the texture preview in the viewer will begin to animate. Now, apply it as the surface to your pool floor and make any sizing adjustments you may need. You also can adjust the rate of the wave by messing with the numerical based slots like Amplitude and Frequency. If for any reason it isn’t moving, or looks incorrect, remember…you may need to select a non-tiling texture as a Source!

That’s how mine came out. Does yours look the same? Pretty easy right? Now, I’d suggest you generally do this sort of thing for very shallow water zones only. Why? Well, try adding it to the floor of a pool you can actually submerge yourself in and see how it looks. Yeah…didn’t like that so much, did you? I don’t either. You can also do this to the ‘walls’ of your shallow pool too…but you don’t always have to. Doing so depends on the size of the pool and how translucent your water sheet is. I find it works best when the surface sheet is the highest it can go to the roof of the subtraction. While this is pretty limited in a lot of ways, remember that the Wet Wave technique is a cosmetic one, and I’m passing it on because it also happens to be the best way to introduce you to the Ice Texture and what kind of business you should be expecting from it. Essentially, grayscale + Source = Distortion.

Feel free to mess with the properties to see how much you can get out of your new lesson. Try using different styles of Bumps. You can get all kinds of results, not all of them limited to shin-high water.

3. Multi-Layered Liquid

This is actually pretty easy, but very few people do it. To start with, most people probably make their water zones with one sheet acting as both the zone portal and the water surface. But guess what? You can actually achieve a more interesting fluid surface using multiple sheets. Okay, you might have known that already. But did you know how you can make Light and Heavy fluid? With more advanced tooling of the Wet Wave method, you can even feign reflective surfaces and add the illusion of “thick” fluid composition.

The first step is really simple. Say you’re making a pool of water that is 256 by 256 around. I don’t care how deep you make yours, but using two or more sheets means a couple of things up front.


You’re going to want to temporarily make your grid size 1, so your multiple sheets are exactly 1 unit apart from each other. This is because you don’t want them to actually touch, yet you very much want to convey the illusion that your water zone has only one surface. Anything more than 1 unit is a bad idea, as it betrays the illusion. And if you don’t feel like trusting me on that…well by all means, give it a shot and see what happens. Again, I’ll wait.

Okay did you see what happened there? Pretty horrible right? I know! Look how ugly it is! So you’ve got to trust me on this. Don’t go higher than 1 unit! The surface of your liquid conveys immediately what the player will conjure of the whole representation. Just like how water color or surface selection plays an important part in dictating what’s clean or dirty or what have you, thickness carries an important trait as well. It gives your fluidic environment weight and completely determines how that player’s eye will relate to sequences in your map. You’ve got to know that people walk through a room at a relatively swift pace, whether you spent a month making that room pretty or not. The player’s eye sees all and sees quickly; collecting visual data and applying it towards their next move. This player’s eye is well trained, and has had ten years of gaming Unreal into submission, mastering every locale. That includes every locale made in any community map you might have heard of. They’ve seen everything, and as a responsible mapper you have to build on the assumption that they’ve seen everything. So when that player’s eye catches your pool, you want it to spend that extra microsecond acknowledging the grime that appears to be floating in the muck…the syrupy gleam that brings to mind hepatitis and excrement. That player’s eye will notice and that player’s eye will give that mouse roll pause to consider the sewage, consider the environment they are wading into, and consider your map as a whole. And if you mess up the unit spacing between multi-layered fluid then you can bet the farm that the player’s eye is going to notice it faster than it takes the human brain to process this thought; “Hey! That’s an error, and I’m playing a video game that someone made in their basement, la la la! Suspension of disbelief betrayed!”


You should be experimenting with different types of translucency or modulation for either sheet, but what you should always know is which one you want as the portal and assign that one first. Personally, I go with the lowest if I can, otherwise the highest. You should usually go lowest if using two sheets. Why? Well, in that case it gives you more freedom with the uppermost layer, and that is where you’ll likely spend most of your creative energy. Don’t worry about swimming players. At one unit of spacing, no amount of bobbing head is going to notice.

With the two sheet method you can do a number of things here. Sometimes it’s good to make the lowest sheet non-translucent and the top one translucent, with a different water texture. Or…the same water texture, just smaller. Or bigger! And set to “small wavy,” but in a different direction than the lower sheet. Sometimes the top should be modulated, and the bottom translucent. Or the bottom should be non-translucent. The only way to know for sure what works is to test your own pool in your own map with a variety textures…and the thing with textures is, there are plenty laying around. And all of them combine differently.

Typically, what works for me is that I almost never use a non-translucent sheet for the lowest one, unless the water zone is particularly big or if I’m trying to convey a particularly thick substance…or a hazard. That doesn’t mean translucence automatically means pristine, quite the contrary! It’s actually easy to make a dirtier fluid layer than a clean one, especially with smart lighting. In most cases of the small-to-medium sized water pool, I’ll make the top layer a specialized modulation-specific texture scaled down quite a bit and set it with reverse movement flows (if used) than what is set on the bottom. What this means is, if you make the bottom layer “small wavy” in surface properties, do the same with the top but mirror by U or V, or both. Or, if using panning surfaces, maybe make both layers go at different paces, so the top flows faster. This is what I usually do with Lava or any fluid type that generates its own light, and when I do this I’m resizing one layer anyway so they can’t flow evenly in the same direction by default. This all sounds weird probably, but it works, and the speed flow technique is especially important with lava or any kind of heavy substance, like mud or tar.

But why take my word on it alone? Consider the examples below. In each there is a simple zone using multiple sheets. I won’t tell you which of these use two layers, or four. Some, as you can see, use auxiliary sheets for where the fluid edge contacts the outer environment. In one example you’ll also see that I combined this method with the wavy floor trick I showed you earlier in the tutorial.

The lava, in particular, is accomplished using multiple sheet layers (more than two, consisting of non-translucent, translucent, and modulated layers) and even thinner sheets on the sides where the Lava touches the wall that have been edged with the vertex tool to create the illusion of a “burning contact” effect with the surrounding architecture. Aided by self-sourcing lighting this makes for some great fluid and is easily better than one sheet lava flows. The textures here with the lava are all custom, and as I said earlier it pays to invest in some custom textures to really hammer these methods home. For instance, I would use something like this for a custom modulation:

If you’re confused by how this all this is done, know that the same texture is used for the lowest and middle layers, sized and panned slightly uneven to each other. The top level is a modulation decal (much like what you would use for texture detail, a Bump, or what I refer to as a Macro in the next bit). It all comes together in a really believable lava current using only sheets, clever lighting, and refreshing texture choices. No meshes, and no tricks that any Unreal Editor can’t do on its own.

Want to see what else you can do?

You can take this further by combining the methods I showed you using Ice Textures to make wavy pool floors with the multi-layer technique you just read about to make quasi-reflective surfaces. We’re getting into advanced stuff now, and you have to know up front that this method is trickier to pull off. But if you do it right then the effect can be really cool. If you already have a vague idea of what I’m referring to then you remember the water surface mesh planes from Operation Na Pali, or the cubemaps introduced in Unreal Tournament 2003/2004. What I’m about to teach you now can be done in UE1 using meshes, and if you’re mapping/modding with the unofficial 227 patch then you already know that meshes are significantly more stable now in implementation, reducing the chances of that gnarly large mesh plane flicker syndrome that has prevented many mappers from making the most of ONP’s technique on UE1 since 2002. Though it probably isn’t perfect still and I have yet to play a SP pack that uses the method any better than ONP. Well, what if instead of meshes you use sheets? What you are about to learn now is merely an alternative method that gets the same effect across using BSP with only variable differences. I discovered this by accident sometime in 2006 and have only replicated in about seven instances good enough for public scrutiny.

You’re either asking yourself “how?” or “Pffft, okay.” Well if you’re the latter, then screw you! Do it however you want. If you’re the former, let’s go over it.

Go into your level and take a screenshot looking up from where you want your water zone to be. For this tutorial I used the example seen in the second set of gifs and took a shot as I was looking at the ceiling while inside the gap where I planned to make the water zone. Usually, it’s better to do this before the zone is in place, but when the subtraction is already present. Think of it like standing in a drained pool.

Import the screenshot as a BMP into MyLevel or a custom package of your choosing and begin your multi-layered sheets. For this exercise, I’m using three. My highest layer is all modulation and my middle one is the screenshot I took (which will now, and forever forward be called the Reflection in this tutorial). The Screenshot should always be in the middle. Hammer that into your skull! My lowest sheet is the portal and I’m giving it a generic water texture. Normally I want to make it non-translucent, but it doesn’t have to be. Why would we want it to be, you ask? Well think of the player wading in your pool. From dry land, they will be seeing your Reflection on the surface, but if they submerge themselves and glance up you don’t want them seeing it as clearly then…no no. If all layers are translucent then this isn’t really a problem, and as you can see in the examples above I’ve accomplished it both ways. But when you make your Reflection non-translucent, it’s always best to follow up with making the layer beneath it also non-translucent. This way, when that pesky player’s eye goes under water and looks up, the “Reflection” will be blocked. In practice, one-sided sheets are a no go on this method. At least…when I’ve tried it.

Okay so, how to make the Reflection?

As you may have already guessed, you will be creating another Wet Wave like you did before and this time the screenshot you took will be your Source. Add a Bump and test it out. Right away you will notice something weird, and if you used the Bump I provided with the tutorial then you will definitely notice. Your new Ice Texture looks…a bit…off center? Don’t worry about this. A simple pan job will even it out when you place it on your layer. What you will need to do is decide on an appropriate Bump, as this technique more than any other you will learn here requires some creativity on your part. Even after reading this there is a good chance you will make really…really…shitty Reflections for a good long number of attempts before you make one that looks decent ingame. You have to really consider your pool, where it is located, and what light sources are in view. You need to rationalize the size of your water zone and how big is too big for this method. In practice, I find that this technique works best in smaller bodies of water where lighting is either really good or really dim with an immediate overhead source. Big bodies of water don’t translate so well, and in those cases you will likely only be able to produce non-translucent Reflections. The biggest I’ve made was in a harbor, and the results on that one…well, look at the first example I showed. Does it look better or worse than the others?

Here are some tips on the Reflective layer that you can’t do without if you really want to make it look right. If an immediate light source is caught in the Reflection, either it be a torch or a bulb or the fucking sun, you have to account for the lighting on the Reflection texture. What this fancy talk actually means it that if you caught a lamp in the screenshot, you have to place a small light on the spot where the image of the lamp was captured and ably bright enough but matching lighting to amplify the light source. Otherwise…Ice Texture or no Ice Texture it will look like a screenshot if the light source is obviously in the image. You have to also know that omnipotent light, and level lighting in general, will make or break this technique. With a mesh you will have the luxury of the environment mesh displacement. Not so here. Lastly, all I can say is learn your modulated/translucent upper layers. They will be your best friend on this technique.

The benefit? No mesh clipping. Ever. On any platform. The downsides are the same. No dynamic reflections can be made to show the player on the surface, obviously. Limited use being the big number two. Otherwise, let’s move on.

4. The Macro Caustic

Okay, this next bit is bananas.

Did you know that Unreal and UT have an unused property that every surface can perform automatically? If you right click on a texture and open its Texture tree in properties you’ll notice the usual values; detail, drawscale, ect. What is also there? Well, none other than the Macro Texture!

What these do, essentially, is add a texture like a grayscale (which is, again, what all detail textures are) as a secondary blending surface that can be seen in-game. It looks kind of weird when you actually apply normal textures to this slot. But what if you try animated textures…like, say, certain Ice Textures you imported and use to animate a Source that exploits an Alpha?

Whoa! I know, right? You have just discovered the amazing world of Caustics. In Unreal Tournament 2003/2004 we saw this done with projectors, but here it’s simply a property that Epic included with Unreal that nobody bothered to use. Of course, as a result of that, there are very few stock textures that work well with this method. There is one in the XFX.utx set called “Detail Test” that can work on a whim, but what you’ll really be using here is custom textures. You can do a variety of weird things with Caustics, but I find that few are as useful as using them in tandem with near-water vicinity surfaces; either for submerged walls, or nearby walls around a pool or water source. I also use them extensively in alien environments, applied in tandem with unconventional light sources like energy grids or gaseous elements.

Yes this portion is brief. Mainly this is because all you’re really doing besides putting a texture in an assigned slot is making a good Caustic texture…and you’ll need to. Like I said, there just aren’t any really good ones in the stock sets. But fear not! You learned how to make Ice Textures, so all you really need is a good grayscale and you’re free to generate your own Caustic animation.

5. High Shadow Detail

I almost did not include this section, as it does not actually require any of the Ice Texture skills I just mentioned. However, it sort of applies with the whole advanced texture yarn and people have been bugging me about this for eons, so I finally have a place to point to. Have you ever wondered how to do…

As any mapper might already know, you can’t reproduce these simply by adding true the High Shadow Detail value in texture properties. There is a certain fineness that seems unattainable that way, yes?

The reason this is true has little to do with your lighting and very much to do with your textures. Make a room that you want to add high detail shadows to and export all the textures for the walls, floors, and ceiling. Pretty much export everything seen on a surface you want to augment. You are going to import these into MyLevel/Custom package and go into the Texture properties of each. The value you are looking for is Drawscale. Yes, that is the real trick to achieving these kinds of shadows. For testing purposes you may want to up the Drawscale to 4, but when you get more adept at this you’ll find your own values. For instance, I always go to 6, so I’ll know that when retexturing my map areas I will usually decrease the size of the Surface Properties to .1667 if the texture in question is a standard 256*256, or rounded divisibles of that decimal (.3334, .0834).

The next step, of course, is to select your lighting. I go by a certain rule here when it comes to emphasizing shadows, and that is that there are only two kinds of lights you want to employ in order to embellish shadows…and they are setting specific. For natural, sky lighting….use Cylinder lights (usually set outside of a room, with gaps to allow transit inward). For enclosed lighting, like torches or electric bulbs, always rely on Nonincidence. Now, these are just my rules. For all other uses you need not go further than implementing basic lighting. You have to of course specify how you want to handle shadows. For example, in my current mappage I have gotten into the habit of making all my surfaces several sizes higher in Drawscale so that every kind of lighting will leave high end shadow detail, as in these shots below. I’m also used to using high detailed S3TC textures that are usually set to high sizes by default, making the resizing process less painless.

The upside is that even the most subtle shadows look awesome, and that small detail credit goes a long way for players…and that infernal player’s eye. Of course, by doing this I have to ensure that the Detail Texture is not omitted, and this is also a step many mappers neglect when doing these kinds of shadows. For instance, a mapper will often not add a Detail slot to a texture set to high Drawscale for shadows. What they might do—if they are particularly irresponsible—is plug in a standard Detail from Detail.utx. What happens then is a very painful visual discrepancy that the player’s eye will notice like a foamy sore on a diseased walrus vagina. The Detail will always look reduced in size on a texture with Drawscale set higher than 1, even worse so if as high as 4 or 6! So what do you do? Well, you export the appropriate Detail Texture, and when you import it into your MyLevel/Custom package you match its Drawscale to your texture. This goes a long way to perfecting your well shaded areas, and it’s simply unprofessional to leave this final step out. Doing this will ensure that your shadows look great at close range as well as from away.

6. Closing Notes

Please know that all these techniques are experimental…as in, you can’t just do them and expect awesome results. They take careful attention and planning, and if you screw them up you will cause more harm to your map than if you simply didn’t use them to begin with. Caustics especially are not to be trifled with in overly performance heavy areas. Everything covered is applicable only on limited means and requires trial and error to perfect. As an aesthetic, this stuff will certainly color your map a prettier shade if you master them all, but that should not mean you do so at the expense of gameplay…otherwise all you’ve done is make a pretty room that is virtually useless to a player—who wants to shoot and kill things, mind you—except for being a nice sightseeing tour.

This is merely an advancement tutorial for mappers who want their environments to have that extra push. There are certainly more techniques I could cover, but these are real obstacles for most people. Ice Textures and Macro Caustics are certainly rare in public work, I’ve noticed, but I’ve had the last five years to mess with them for my projects (and I probably should have made a tutorial sooner…I just assumed someone else would sooner or later). But just know that I’ve had all that time to mess with this stuff so it became second nature to my mapping, and I still have to trial and error these techniques.


7. Credits

Thanks to UArchitect for Bump and some pix

Thanks for Waffnuffly for two gifs

Non-Tutorial Maps from Residual Decay and Dead Cell