Tutorial — Hair Cards and Groom LODs for Headsets
Augmented Traveler local tutorial. Back to Grooms — Tutorials · profiling: Tutorial — Performance Profiling · groom source: Tutorial — XGen Period Hair for MetaHuman · headset builds: Quest — Tutorials
Strand hair looks right on the kiosk but does not run on Quest, Android XR or phones. This tutorial sets up groom LODs so each surface gets strands, cards or meshes, generates cards with the Hair Card Generator, and tests the result.
Draft. Written from Epic's UE 5.8 groom docs. The Hair Card Generator is Experimental ("use caution when shipping with it"). Budgets below are our starting targets, not Epic figures. Correct menu names here after the first run.
1. What runs where
| Geometry | Platforms (Epic) | Our surfaces |
|---|---|---|
| Strands | Windows (DX11, DX12, Vulkan), macOS (SM6 on M2+), Linux, PS5, Xbox Series | Kiosk (RTX 5090), PC-VR, Pixel Streaming server |
| Cards | All platforms | Quest 3, Android XR, phones, Vision Pro (test) |
| Meshes | All platforms | Phones and far LODs; bun or cap-covered hair |
- Skinned attachment and Global Interpolation (RBF) are not supported on mobile. Test jaw and head follow on the card version.
- MetaHuman's own grooms: higher LODs use strands, lower LODs use cards or meshes; short grooms such as eyebrows are baked into skin textures at lower LODs. Copy that pattern.
2. LOD plan per groom
Set this in the Groom Asset Editor → Level of Detail panel (Geometry Type per LOD).
| LOD | Geometry | Used by | Notes |
|---|---|---|---|
| 0 | Strands | Kiosk close-up | Full density |
| 1 | Strands (decimated curves) | Kiosk mid, PC-VR | Curve decimation in the LOD settings |
| 2 | Cards (high) | Quest 3 close, Vision Pro | From the Hair Card Generator |
| 3 | Cards (low) | Quest far, phones | Fewer clumps; reduce from LOD 2 |
| 4 | Mesh | Phones far, fallback | Solid mesh with coverage texture |
Per-platform minimum LOD: in the LOD panel, use Add (+) to add a platform override and set a Minimum LOD (for example Android minimum LOD 2), so strands are never selected on headsets. The Groom component also has LOD Bias and a Use Cards option to force cards.
Cap-covered figures: build the LODs from the capped groom (Tutorial — Hair Under Caps and Bonnets).
3. Generate cards (Hair Card Generator, Dataflow)
- Plugins: Edit → Plugins → enable Hair Card Generator, plus Editor Dataflow Graph and Geometry Dataflow. Restart.
- Right-click the Groom Asset → Create Dataflow Asset → choose the Cards template. The graph includes GroomAssetToCollection, BuildCardSettings, GenerateCardsClumps, GenerateCardsGeometry, GenerateCardsTextures and CardAssetTerminal.
- In BuildCardSettings, add one element per card LOD. Set its LOD Index (2, then 3).
- Add filters per group so the bands, bun and flyaways get separate budgets:
- Num Clumps: card count and width. Bands need more, narrow cards; the bun can use fewer.
- Num Triangles: triangle budget per filter.
- Num Textures: unique texture islands.
- Num Flyaways: single-strand cards. Keep very low for oiled period hair.
- Multi Card Clumps: three cards per clump for volume. Try it on the bun only.
- Advanced Options: set Texture Atlas Size and choose to reduce cards from the previous LOD for LOD 3.
- Evaluate the graph. Inspect clumps and textures in the Construction Viewport.
- In the Groom Asset details, set that LOD's Geometry Type to Cards.
- In the Cards panel check the textures (Depth, Coverage, Tangent, Attributes, Color/Roughness), the Material, Group Index and LOD Index.
Chaos Hair (5.8). The release notes list "Card generation to skeletal mesh", Nanite-compatible rendering and simulation, and expanded attribute painting and skin weighting. No 5.8 how-to page was found; unconfirmed; check on first use whether carded hair as a skeletal mesh suits Quest better than groom cards.
For facial hair, generate cards per beard group (Tutorial — Period Facial Hair Grooms).
4. Starting budgets (ours; adjust after profiling)
| Surface | Hair triangles (all grooms) | Card atlas | Notes |
|---|---|---|---|
| Quest 3 / Android XR | Target under ~20k | 1× 2048² set, shared across groups | Test ASTC compression on hair alpha edges |
| Phones | Target under ~10k | 1024²–2048² | Mesh LOD for far views |
| Vision Pro | As Quest to start | 2048² | Test before raising |
These are not from Epic. Measure with Tutorial — Performance Profiling and replace them.
5. Material and look on cards
- Cards need a cards-compatible hair material; check the material the generator assigns before replacing it with ours.
- Match colour to the strand version using the same Melanin / Redness values from the evidence sheet.
- Sorting and alpha: check layered cards over the forehead and ears in stereo on the headset. Edges read more in VR than on a monitor.
- Period hair is flat and smooth. Cards suit it better than modern loose styles. Keep flyaway cards minimal.
6. Kiosk strand cost
Strands on the kiosk still need checks:
- Profile with
stat gpu(hair has its own passes). - Epic's scalability cvars include
r.HairStrands.Voxelization.VoxelSizeInPixel,r.HairStrands.SkyLighting.SampleCountandr.HairStrands.Shadow.CastShadowWhenNonVisible. Change one at a time and record before/after. - Auto LOD bias reduces curves faster as the groom gets smaller on screen. It rarely helps a life-size kiosk figure; test anyway.
7. Test
- Package a Quest build (Tutorial — Performance Profiling for the steps and
statcommands). - Confirm the card LOD is active (no strands on device).
- Check at 1 m and 3 m: parting line, ear bands, bun silhouette.
- Check with speech and a head turn: no card lag at the hairline or jaw.
- Record GPU time for hair before and after each change.
8. Practice exercise
Generate LOD 2 and LOD 3 cards for Mitchell's 1847 groom with two settings: (a) default clumps, (b) double clumps on front_bands, half on bun. Compare triangle counts and the parting at 1 m on Quest.
9. Check before a headset build
Sources
- Epic, Groom Platform Support: https://dev.epicgames.com/documentation/unreal-engine/groom-platform-support-in-unreal-engine
- Epic, Setting Up Cards and Meshes for Grooms: https://dev.epicgames.com/documentation/unreal-engine/setting-up-cards-and-meshes-for-grooms-in-unreal-engine
- Epic, Hair Card Generator for Grooms: https://dev.epicgames.com/documentation/unreal-engine/hair-card-generator-for-grooms-in-unreal-engine
- Epic, Hair Card Generator in Dataflow: https://dev.epicgames.com/documentation/metahuman/hair-card-generator-in-dataflow-in-unreal-engine
- Epic, Groom Scalability and Performance: https://dev.epicgames.com/documentation/unreal-engine/groom-scalability-and-performance-with-unreal-engine
- Epic, Groom Asset Editor User Guide: https://dev.epicgames.com/documentation/en-us/unreal-engine/groom-asset-editor-user-guide-in-unreal-engine
- Epic, Groom Components and Assets: https://dev.epicgames.com/documentation/unreal-engine/groom-components-and-assets-in-unreal-engine
- Epic, Controlling MetaHuman LODs in Unreal Engine: https://dev.epicgames.com/documentation/metahuman/controlling-metahuman-levels-of-detail-lods-in-unreal-engine
- Epic, MetaHuman Assets Overview: https://dev.epicgames.com/documentation/metahuman/assets-overview
- Epic, Unreal Engine 5.8 release notes: https://dev.epicgames.com/documentation/unreal-engine/unreal-engine-5-8-release-notes
- Full list: Sources — 2026-09-20