TF2 Water Materials

An info sheet about water materials in Team Fortress 2.

This is an info sheet about water materials in Team Fortress 2. A "material" is simply a list of properties and textures that a surface or volume can have. This page only covers materials that were made for TF2 and ignores the HL2 assets that also happen to be in the game.

Water materials always come in pairs: A top (or surface) material and a bottom (or beneath) material. The top material controls what the surface looks like when watching it from above. It's the material you actually use in Hammer. The bottom material controls what the water looks like once you are swimming inside of it. It should never be used in Hammer! At least for now, this page only covers the surface materials, but knowing which bottom material is used by which top material is still important.

TF2 water materials are mostly quite similar and can be grouped into the following 3 categories:

Regular Water

Most water materials in TF2 fall into this category.
The material uses the Water shader, has cube-map reflections on the surface, an underwater refraction effect, a thick colored fog, and an animated normal-map. A Proxy is used to move the normal-map around. However, this only affects the refractions and doesn't look like any coherent movement.

Expensive Water

This category is rather rare as it requires more processing power to render.
On top of what "Regular Water" does, this material renders real-time reflections of the world instead of using a nearby cube-map. Proxies will affect both refractions and reflections, allowing the water to visually flow in a specific direction or pattern.
Water becomes expensive if it includes any parameter that affects reflections, such as $ReflectTint and $ReflectAmount.

Cheap Water

Water in this category is the easiest one to render and is therefore quite popular for purely visual effects.
Unlike what "Regular Water" does, this material does not have any fog. The surface may not even be see-through and the shader may be replaced with LightmappedGeneric.
Water becomes cheap if it uses a shader other than Water or if either $CompileKeepLight or $ForceCheap is set to 1.

For more information about water in the Source Engine as a whole, read the VDC: https://developer.valvesoftware.com/wiki/Water

Surface Materials

Here is the list of all water top materials that are included in TF2 by default.

swamp/water/water_murky

An in-game screenshot of the water with the number 170. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {35 32 20} $FogStart: 0 $FogEnd: 170
Refraction Settings $RefractAmount: 0.32
TextureScroll Proxy Rate: 0.02 Angle: 10 (east)
Bottom Material swamp/water/water_murky_beneath.vmt

The VMT includes the line "$basetexture" "swamp/water/water_murky". This base texture is 4 times larger than the normal-map texture, so the game scales up the normal-map accordingly. However, the Water shader does not actually render base textures, so the increased scale was most likely unintentional.


swamp/water/water_swamp

An in-game screenshot of the water with the number 100. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {27 26 21} $FogStart: 0 $FogEnd: 100
Refraction Settings $RefractAmount: 0.06
TextureScroll Proxy Rate: 0.6 Angle: 10 (east)
Bottom Material water/water_2fort_beneath.vmt
Fallback Materials <dx90: water/water_2fort_dx80Water_DX60: nature/water_dx70

water/water_2fort

An in-game screenshot of the water with the number 400. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {51 43 13} $FogStart: -100 $FogEnd: 400
Refraction Settings $RefractAmount: 0.32
TextureTransform Proxy repeating, sinusoidal motion
Bottom Material water/water_2fort_beneath.vmt
Fallback Materials <dx90: water/water_2fort_dx80Water_DX60: nature/water_dx70

water/water_2fort_dx80

An in-game screenshot of the water with the number 400. The number is pointing at the fog.

Regular Water Used As Fallback

Fog Settings $FogColor: {51 43 13} $FogStart: -100 $FogEnd: 400
Refraction Settings $RefractAmount: 0.6
TextureTransform Proxy repeating, sinusoidal motion
Bottom Material water/water_2fort_beneath.vmt

The normal-map is DXT1 compressed. This means it has blocky artifacts but takes up less VRAM.


water/water_2fort_expensive

An in-game screenshot of the water with the text 'Expensive' at the top, the text 'Flow' below with an arrow that circles back into itself next to it and the number 400 below all that. The number is pointing at the fog.

Expensive Water

Fog Settings $FogColor: {51 43 13} $FogStart: 1 $FogEnd: 400
Refraction Settings $RefractAmount: 0.32
TextureTransform Proxy repeating, sinusoidal motion
Bottom Material water/water_2fort_beneath.vmt
Fallback Materials Water_DX60: nature/water_dx70

water/water_2fort_skybox

An in-game screenshot of the water with the text 'Cheap' at the top. The surface is opaque.

Cheap Water

Fog Settings $FogColor: {51 43 13}
Bottom Material water/water_2fort_beneath.vmt
Fallback Materials <dx90: water/water_2fort_skybox_dx80Water_DX60: nature/water_dx70

This water is completely opaque.


water/water_2fort_skybox_dx80

An in-game screenshot of the water with the text 'Cheap' at the top. The surface is opaque.

Cheap Water Used As Fallback

Fog Settings $FogColor: {51 43 13}
Bottom Material water/water_2fort_beneath.vmt

This water is completely opaque.

The normal-map is DXT1 compressed. This means it has blocky artifacts but takes up less VRAM.


water/water_doublecross

An in-game screenshot of the water with the number 300. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {57 54 44} $FogStart: 0 $FogEnd: 300
Refraction Settings $RefractAmount: 0.12
TextureScroll Proxy Rate: 0.6 Angle: 10 (east)
Bottom Material water/water_2fort_beneath.vmt
Fallback Materials <dx90: water/water_2fort_dx80Water_DX60: nature/water_dx70

water/water_hydro_cheap

An in-game screenshot of the water with the text 'Cheap' at the top. The surface is transparent and there is no fog.

Cheap Water

Shader LightMappedGeneric
Base Texture water/water_hydro_base
Reflection Settings $EnvMapTint: [0.2 0.2 0.2]
Bottom Material water/water_well_beneath.vmt
Fallback Materials <dx90: water/water_hydro_cheap_dx80

The normal-map is DXT1 compressed. This means it has blocky artifacts but takes up less VRAM.

The base texture does not tile, literally. It only appears near the origin of the map. The border pixels stretch out to infinity. This visually splits the map into 4 quadrants.


water/water_hydro_cheap_dx80

An in-game screenshot of the water with the text 'Cheap' at the top. The surface is opaque.

Cheap Water Used As Fallback

Shader LightMappedGeneric
Base Texture water/water_hydro_base
Reflection Settings $EnvMapTint: [0.2 0.2 0.2]
Bottom Material water/water_well_beneath.vmt

This water is completely opaque.

The normal-map is DXT1 compressed. This means it has blocky artifacts but takes up less VRAM.

The base texture does not tile, literally. It only appears near the origin of the map. The border pixels stretch out to infinity. This visually splits the map into 4 quadrants.


water/water_island_cheap

An in-game screenshot of the water with the text 'Cheap' at the top and the text 'Static' right below. The surface is translucent and there is no fog.

Cheap Water Used As Fallback

Bottom Material water/water_well_beneath.vmt

This water is completely translucent.

This material uses a different normal-map than usual. It is not animated.

The normal-map is DXT1 compressed. This means it has blocky artifacts but takes up less VRAM.


water/water_island_dx80

An in-game screenshot of the water with the text 'Expensive' at the top, the text 'Flow' below with an arrow pointing down and to the left next to it and the number 400 below all that. The number is pointing at the fog.

Expensive Water

Reflection Settings $ReflectTint: {208 157 155} $ReflectAmount: 1
Fog Settings $FogColor: {148 197 195} $FogStart: 1 $FogEnd: 400
Refraction Settings $RefractTint: {144 255 240} $RefractAmount: 0.2
TextureScroll Proxy Rate: 0.1 Angle: 315 (south-west)
Bottom Material water/water_well_beneath.vmt
Fallback Materials <dx90: water/water_island_cheap

This material uses a different normal-map than usual. It is not animated.

The material also has a TextureTransform proxy. However, the TextureScroll proxy is placed right after, overwriting it.

The normal-map is DXT1 compressed. This means it has blocky artifacts but takes up less VRAM.


water/water_moon_redbase

An in-game screenshot of the water with the number 300. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {53 38 2} $FogStart: 1 $FogEnd: 300
Refraction Settings $RefractAmount: 0.2
TextureTransform Proxy repeating, sinusoidal motion
Bottom Material water/water_well_beneath.vmt
Fallback Materials <dx90: water/water_well_dx80

The colors of the bottom and fallback materials do not match the fog color of this material.


water/water_powerhouse

An in-game screenshot of the water with the number 100. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {57 54 44} $FogStart: 0 $FogEnd: 100
Refraction Settings $RefractAmount: 0.12
TextureScroll Proxy Rate: 0.6 Angle: 170 (west)
Bottom Material water/water_2fort_beneath.vmt
Fallback Materials <dx90: water/water_2fort_dx80Water_DX60: nature/water_dx70

water/water_sawmill

An in-game screenshot of the water with the number 100. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {57 54 44} $FogStart: 0 $FogEnd: 100
Refraction Settings $RefractAmount: 0.12
TextureScroll Proxy Rate: 0.6 Angle: 10 (east)
Bottom Material water/water_2fort_beneath.vmt
Fallback Materials <dx90: water/water_2fort_dx80Water_DX60: nature/water_dx70

water/water_underworld

An in-game screenshot of the water with the text 'Cheap' at the top. The surface is opaque.

Cheap Water

Fog Settings $FogColor: {1 1 1}
Bottom Material water/water_underworld_beneath.vmt
Fallback Materials Water_DX60: nature/water_dx70

This water is completely opaque.


water/water_underworld2

An in-game screenshot of the water with the text 'Cheap' at the top. The surface is opaque.

Cheap Water

Fog Settings $FogColor: {1 1 1}
Bottom Material water/water_underworld_beneath.vmt
Fallback Materials Water_DX60: nature/water_dx70

This water is completely opaque.

The normal-map animates at 28 fps instead of the usual 30 fps.


water/water_well

An in-game screenshot of the water with the number 300. The number is pointing at the fog.

Regular Water

Fog Settings $FogColor: {24 38 53} $FogStart: 1 $FogEnd: 300
Refraction Settings $RefractAmount: 0.2
TextureTransform Proxy repeating, sinusoidal motion
Bottom Material water/water_well_beneath.vmt
Fallback Materials <dx90: water/water_well_dx80

water/water_well_dx80

An in-game screenshot of the water with the number 300. The number is pointing at the fog.

Regular Water Used As Fallback

Fog Settings $FogColor: {24 38 53} $FogStart: 1 $FogEnd: 300
Refraction Settings $RefractTint: {184 191 208} $RefractAmount: 0.6
TextureTransform Proxy repeating, sinusoidal motion
Bottom Material water/water_well_beneath.vmt

The normal-map is DXT1 compressed. This means it has blocky artifacts but takes up less VRAM.