This page is incomplete! You can contribute information using GitHub issues or pull requests.

Water shaders are characterized by their use of layered animated ripple maps, tint colours, and reflectance.

They need not exclusively be used for water -- the coolant pools of Keyes (d20) also use water shaders, and the Halo CE Refined project uses them for some glass to better emulate Xbox glass shaders. They are also not exclusively used within the BSP, with skies like Damnation's also using this shader type.

Flowing water with rapids, like waterfalls and rivers, can instead use shader_transparent_chicago which allows for more varied animation and map blending.

Base maps

Water shaders do not tile their base maps. Instead, the edges of the texture continue infinitely ("clamp" texture address mode). This can be useful for concentrating texel density near the level without dedicating texture space to surroundings which stretch to the horizon.

Known issues

Ripple maps are not rendered correctly in H1PC and H1CE compared to classic Xbox. The highest level of detail mipmap is used for the most distant areas, but water closer to the camera uses the lowest detail mipmap. This is the opposite of how it should be, and results in distant water suffering from major aliasing. The water shader was fixed in H1A.

Related HaloScript



(rasterizer_water [boolean])

Toggles the rendering of shader_transparent_water shaders.


Structure and fields

water flagsbitfield
base map alpha modulates reflection0x1
base map color modulates background0x2
atmospheric fog0x4
draw before fog0x8
base mapTagDependency: bitmap
view perpendicular brightnessfloat
  • Min: 0
  • Max: 1
view perpendicular tint colorColorRGB
view parallel brightnessfloat
  • Min: 0
  • Max: 1
  • Default: 1
view parallel tint colorColorRGB
reflection mapTagDependency: bitmap
ripple animation anglefloat
ripple animation velocityfloat
ripple scalefloat
  • Default: 1
ripple mapsTagDependency: bitmap
ripple mipmap levelsuint16
  • Default: 1
ripple mipmap fade factorfloat
  • Min: 0
  • Max: 1
ripple mipmap detail biasfloat
  • HEK max count: 4
  • Max: 4
contribution factorfloat
  • Min: 0
  • Max: 1
animation anglefloat
animation velocityfloat
map offsetVector2D
map repeatsuint16
  • Default: 1
map indexuint16


Thanks to the following individuals for their research or contributions to this topic:

  • gbMichelle (Discovering that base maps do not tile)
  • Kavawuvi (Invader tag definitions)
  • MosesOfEgypt (Tag structure research)