GroomLab

Game export

Hair cards with LODs, and strands for Unreal, Unity and glTF.

Hair cards with baked maps
Cards follow the groom's clumps; maps are baked from its own strands.

Cards

Add a Cards node (Add Node > Games) where the look should be carded, or run groomlab.create_cards(groom, lod="mid"). The cards follow the groom's clumps and shape, and their textures are baked from its own strands.

The node's panel shows what its cards cost and has Show cards, Show textures, LOD, Bake Maps, Bake Scalp and the exports.

  • LODs: Hero, Mid and Low set a triangle budget (about 50k, 15k and 4k) and the card layout that goes with it. Every level keeps the groom's silhouette: fewer cards, not bigger ones.
  • They look like the strands: in the viewport the cards are lit as the strands are (their normals, highlight and ambient), and each card is tinted to its own strands' color, root to tip, while the textures stay shared. The exports carry the same: the normals, and the tint as a vertex color (glTF: _TINT).
  • Baked maps: depth, coverage, tangent, attribute, color and AO, in Unreal's hair card layout.
  • The atlas survives brushing: after a bake, cards rebuilt by later edits keep their place in the atlas. A node whose maps are out of date gets an orange badge.
  • Bake Scalp bakes the hair near the skin into the scalp's UVs, with a hair cap, so low LODs don't show bare skin between cards.
  • Cards are always built from the whole groom: the viewport's preview density never thins them.

Where to send them

TargetMenuWhat you get
Unreal cardsCards node > Export for Unreal..._cards.fbx, the six maps, the hair cap and a JSON of the channels
Unreal strandsGroomLab > Export > Unreal Groom...Alembic in Unreal's groom format, with guides for simulation
Unity cardsGroomLab > Export > Unity Cards...FBX (Y up, meters), PNG maps and suggested HDRP and URP materials
Unity strandsGroomLab > Export > Unity Strands (.abc)...Alembic for Unity's strand hair package
glTF cardsGroomLab > Export > glTF Cards....glb with the maps inside, one mesh per LOD

Exporting several LODs into one folder keeps them apart: names end in _hero, _mid or _low.

groomlab.create_cards(groom, lod="hero")
groomlab.export_cards_unreal(groom, "C:/game/hair", "hair", lod="hero")
groomlab.export_cards_gltf(groom, lods=["hero", "mid", "low"])
groomlab.export_unreal_groom(groom, "C:/game/hair.abc")

Color patterns in engines

HairColor's bands, feather patterns and tips are colors per point, and its iridescence a mask per point (Color patterns):

TargetColorsIridescence
Unreal strandsgroom_color per vertexgroom_iridescence per vertex; with Iridescence as AO (iridescence_as_ao=True) also groom_ao, which the Hair Attributes node gives a material
Cards (Unreal, glTF, Unity)Baked into the Color map (a feather's card is its vane laid flat, so its patterns map straight on)The Color map's alpha (Unreal; RGBA only then); Unity's Mask map's red; glTF: not carried
Unity strandsOne color per strand (Cd, as GroomLab's Alembic writes it; bands and patterns along a strand do not travel)Not carried
glTF cardsThe baked _BaseColor and each card's _TINTNot carried (the alpha is the coverage)

The repository's docs/UNREAL_HAIR_MATERIAL.md is a recipe for the Unreal material (strands and cards) that mixes the iridescent color in by that mask, its hue turned by the view's angle, with tools/unreal/groomlab_hair_material.json describing the same graph node by node.

Feathers in engines

  • As cards: groomlab.create_feather_cards(groom, lod="mid") gives one alpha-tested strip per feather, both vanes and the rachis baked into its texture, alike feathers sharing a few textures. Each card folds along a spine so lifted or cupped vanes show as a V. Unreal, Unity and glTF take them.
  • As strands: the rachis becomes a mesh to skin with the character, and the barbs are strands rooted on it.
    • Unreal: groomlab.create_rachis_mesh, export_rachis and export_unreal_groom.
    • Unity: GroomLab > Export > Unity Feathers... writes the strands, the rachis FBX and a manifest of the Hair Asset settings.

On this page