This page needs help! Please submit any missing information via GitHub issues or pull requests.

The shader_model tag is used for opaque materials on object models. It supports features like map animation, detail maps, specularity, self-illumination, and colour change (e.g. for armour ranks/teams).

Singleplayer units have their colors set in their actor_variant tags. In multiplayer, players' armor colors are hard-coded.

Base map

The Chief's base map, with alpha shown in the top right.

The base map controls the diffuse colour and transparency of the shader. The RGB diffuse colour is multiplied with the colour change source if used, masked by the multipurpose map's colour change mask. The base map's alpha channel is a transparency mask.

Multipurpose map

The multipurpose map is an optional bitmap whose individual channels provide greyscale masks for colour change, reflections, self illumination, and detail maps (a technique called channel packing). The purpose of each channel depends on the game version:

Gearbox

The Chief's multipurpose map with alpha shown in the top right (Gearbox channel order).

When Gearbox ported Halo to PC, the channels were reordered for an unknown reason. This is also true for all Gearbox-derived ports like H1A unless the OG Xbox channel order flag is set. Because of this change in shader behaviour, multipurpose map tags differ between H1X and Gearbox.

If you're using the legacy HEK and H1CE, don't pay attention to Guerilla's channel usage description when editing this tag. It describes Xbox channel order which is incorrect. In H1A Guerilla this description is corrected.

  • Red: is an auxiliary mask. It can mask the detail map if the detail mask is set to multipurpose map alpha. Despite the option saying "alpha" in Guerilla it really means the red channel in this context.
  • Green: Masks self-illumination, used for lights on the model. The self-illumination is added to diffuse light and then multiplied with diffuse colour, rather than being added after. This means pure black areas of the diffuse map cannot have self-illumination.
  • Blue: Masks cube map specular reflections. Pure blue is highest specularity, while black is none.
  • Alpha: Masks colour change, such as for armour ranks/teams. Colour sources include the actor_variant, multiplayer colours, and object.

It is a common misconception that multipurpose maps need to be purple due to some stock tags having an identical red and blue channel. However, it is not necessary to have any red channel information if you do not require detail map masking or another channel can serve as the detail map mask.

Xbox

Channel order is different on the classic Xbox version of the game. Guerilla correctly describes multipurpose maps extracted from Xbox maps:

  • Red: Specular reflection mask (modulates reflections)
  • Green: Self-illumination mask (adds to diffuse light)
  • Blue: Primary change-color mask (recolors diffuse map)
  • Alpha: Auxiliary mask

Structure and fields

This tag inherits fields from shader which are not shown here. See the parent's page for more information. The following information is unique to the shader_model tag.

Field Type Comments
shader model flags bitfield
Flag Mask Comments
detail after reflection 0x1

If enabled, detail maps should be applied over specular reflections. This flag does not work as intended in the Gearbox renderer but can be worked around with Chimera. It is fixed in H1A.

two sided 0x2
not alpha tested 0x4
alpha blended decal 0x8
true atmospheric fog 0x10
disable two sided culling 0x20
multipurpose map uses og xbox channel order 0x40
  • H1A only

If enabled, the multipurpose map will use Xbox channel order instead of Gearbox order.

translucency float
change color source enum
Option Value Comments
none 0x0
a 0x1
b 0x2
c 0x3
d 0x4
shader model more flags bitfield
Flag Mask Comments
no random phase 0x1
color source enum?
animation function enum
Option Value Comments
one 0x0
zero 0x1
cosine 0x2
cosine variable period 0x3
diagonal wave 0x4
diagonal wave variable period 0x5
slide 0x6
slide variable period 0x7
noise 0x8
jitter 0x9
wander 0xA
spark 0xB
animation period float
  • Unit: seconds
  • Default: 1
animation color lower bound ColorRGB
Field Type Comments
red float
green float
blue float
animation color upper bound ColorRGB?
map u scale float
  • Default: 1
map v scale float
  • Default: 1
base map

TagDependency: bitmap

A bitmap which provides diffuse colour and transparency information to the shader. See details.

multipurpose map

TagDependency: bitmap

A bitmap which provides masks for reflection, self-illumination, colour change, and detail maps. See details.

detail function enum
Option Value Comments
double biased multiply 0x0
multiply 0x1
double biased add 0x2
detail mask enum

Determines the source of detail map masking.

Option Value Comments
none 0x0
reflection mask inverse 0x1
reflection mask 0x2
self illumination mask inverse 0x3
self illumination mask 0x4
change color mask inverse 0x5
change color mask 0x6
auxiliary mask inverse 0x7
auxiliary mask 0x8

Use the "auxiliary mask", which is the alpha channel on Xbox and the red channel in Gearbox-derived ports.

detail map scale float
  • Default: 1
detail map

TagDependency: bitmap

detail map v scale float
  • Default: 1
u animation source enum
Option Value Comments
none 0x0
a out 0x1
b out 0x2
c out 0x3
d out 0x4
u animation function enum?
u animation period float
  • Unit: seconds
  • Default: 1
u animation phase float
u animation scale float
  • Unit: repeats
  • Default: 1
v animation source enum?
v animation function enum?
v animation period float
  • Unit: seconds
  • Default: 1
v animation phase float
v animation scale float
  • Unit: repeats
  • Default: 1
rotation animation source enum?
rotation animation function enum?
rotation animation period float
  • Unit: seconds
  • Default: 1
rotation animation phase float
rotation animation scale float
  • Unit: degrees
  • Default: 360
rotation animation center Point2D
Field Type Comments
x float
y float
reflection falloff distance float
  • Unit: world units
reflection cutoff distance float
  • Unit: world units
perpendicular brightness float
  • Min: 0
  • Max: 1
perpendicular tint color ColorRGB?
parallel brightness float
  • Min: 0
  • Max: 1
parallel tint color ColorRGB?
reflection cube map

TagDependency: bitmap

unknown float
  • Cache only

Acknowledgements

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

  • Jakey (Discovering that self-illumination is added to diffuse light, not diffuse colour)
  • Kavawuvi (Invader tag definitions)
  • MosesOfEgypt (Tag structure research)
  • t3h lag (Explaining multipurpose map channels)