We are researching the new MetaHuman Crowd pipeline in UE 5.8 for our game. Our goal is to use cheap MetaHuman NPCs for villages/player settlements, while preserving high fidelity when characters are close or in dialogue.
We would like to use groom asset strand hair on the high-res actor representation. The default crowd pipeline seems to use skeletal/card/mesh hair for the generated crowd actors, and strand groom hair is not supported out of the box for high-res crowd actors as far as we can tell.
Questions:
- Are there plans for Epic to officially support groom asset strand hair on MetaHuman Crowd high-res actors?
- What is the recommended approach today if we want high-res actors to use strand grooms while keeping ISKM/card hair for lower-distance crowd representation?
- With our current approach described in “Steps to Reproduce”, the geometry swap works, but hair color/material appearance differs significantly between ISKM and high-res actor. The ISKM hair appears darker, while the high-res groom/card hair appears brighter/lighter, even if forcing LOD2 which is the same mesh as in the ISKM. Is there anything we can do additionally, to bridge that gap?
[Image Removed] [Image Removed]
Video of how it looks with strands enabled (LOD1/0):
https://www.loom.com/share/e3e7ae3b80f94588a9f4d534a497751e
From inspection, it looks like the ISKM hair uses the crowd instanced material path, for example MI_Hair_Cards_Instanced, with Use PerInstanceCustomData = 1. The high-res actor/card path uses actor material instances, for example MI_Hair_Cards_Actor, with Use PerInstanceCustomData = 0. Our runtime UGroomComponent then uses groom asset materials/MIDs and copies parameters from the actor card material, but this does not fully match the ISKM material path or the per-instance custom data.
What is the correct way to make the high-res actor/groom hair match the ISKM hair color and shading? Should we copy the ISKM custom data into actor/groom material parameters, use the generated actor card material as the groom card material parent, or is there an intended pipeline hook for transferring these values?
We are happy to share a repository of our approach if it helps, just let me know.
Best regards,
Matthias
[Attachment Removed]