Realtime hair-strand, skin, and eye rendering for digital humans. (Currently WIP)
The build calls find_package(Alembic) first and, if no SDK is installed,
downloads and builds Alembic 1.8.8 (+ Imath 3.1.12, pinned by SHA256) via
FetchContent. Either path defines WDHUMAN_ALEMBIC_SUPPORTED.
To use a system SDK instead, install it (vcpkg install alembic:x64-windows)
and configure with the vcpkg toolchain file. To opt out of import entirely,
configure with -DWDHUMAN_FETCH_ALEMBIC=OFF; AlembicGroomBuilder::ParseAlembic
then compiles to a stub that fails with an AZ_Error naming the missing SDK.
Add WDHuman to your project's gem_names in project.json, then build the
WDHuman / WDHuman.Editor targets and let the Asset Processor run — it cooks
the gem's passes, shaders and materials on first sight.
Assign Materials/Types/Skin.materialtype to a head mesh. It uses Atom's Skin
lighting model, so subsurface scattering is handled by Atom's own 200-sample
Burley SubsurfaceScatteringPass — the material's SSS Strength / Quality drive
that pass. There is no WDHuman-specific pass to enable.
Eye.materialtype currently mirrors Atom's stock eye material; prefer Atom's
until a WDHuman-specific eye feature lands.
Drop an .abc curves export (Maya / Houdini / Blender) anywhere under a scanned
assets folder. The Asset Processor cooks it to a .groomasset via
AlembicGroomBuilder. Group names are classified by substring — guide,
eyelash, eyebrow/brow, peach/fuzz, otherwise plain strands.
A ready-made 64-strand test groom lives at Assets/Testing/HairPatch.abc.
Regenerate or resize it with:
AzTestRunner.exe WDHuman.Tests.dll AzRunUnitTests --gtest_filter=GenerateTestContent.DISABLED_WriteHairPatchAlembic --gtest_also_run_disabled_testsAuthoring settings (per-group role overrides, decimation, import scale, CV
counts, per-group materials) live in a source-side sidecar named
<groom>.abc.groomsettings, edited from Tools > Groom Editor. Saving it
re-cooks the groom.
Hair rendering is opt-in and off by default — turn it on first, or nothing below draws anything:
r.WDHuman.Hair.Enable 1
Then add WDHuman Hair to an entity (Add Component > WDHuman) and point
Groom Asset at the cooked .groomasset. The groom renders in the Editor
viewport as soon as the asset loads; entering game mode spawns the equivalent
runtime component. Changing the asset or the Visible checkbox updates the
viewport immediately, and re-cooking the groom hot-reloads it.
The hair passes refuse to install unless the pipeline has a TAA pass, because
the strand rasterizer is stochastically sampled and relies on a temporal
resolve. Override with r.WDHuman.Hair.RequireTAA 0 and expect severe aliasing.
Nine debug visualisations (fragment-count heatmap, voxel density, individual
BCSDF lobes, tangents, deep opacity maps) are documented in
Docs/DebugViews.md and selected with
r.WDHuman.Hair.DebugView <0-9>. Live counters are in the WDHuman Profiler
ImGui panel.
WDHuman ships three quality tiers — see the design spec at
docs/superpowers/specs/2026-05-28-wdhuman-gem-design.md for the full table.
Configure via r.WDHuman.Hair.QualityTier (0 = raster, 1 = RT-hybrid, 2 = path-traced).