Metahuman Hair groom in scene capture 2D, UE 5.6

Hello, i’m trying to render the scene into a USceneCaptureComponent2D. In our game we will switch between standard player camera and scene capture a lot, so for performance reasons we decided to turn off player camera, while we render into scene capture.

We do this by setting UGameViewportClient::bDisableWorldRendering to true and calling pSceneCapture->CaptureScene(); every frame.

This led to a significant gain in FPS compared to letting both the viewport and scene capture getting rendered every frame.
Also, i have to call CaptureScene explicitly, as the USceneCaptureComponent2D doesn’t seem to be updated when bDisableWorldRendering is set to true.

The problem is that we are using metahumans for our characters, and metahuman grooms don’t handle this setup very well. The hair doesn’t seem to be updated, when the UGameViewportClient::bDisableWorldRendering is set to true, leading to the hair being “dragged around” by the head.

So far i tried to move CaptureScene to a actor, that is in the “post update work” tick group, while keeping the metahuman character and all its components in the “pre physics” tick group.

I also tried calling MarkRenderStateDirty, ResetSimulation, UpdateHairSimulation, TickAtThisTime, TickComponent on the UGroomComponent.

I also tried to get references to the UNiagaraComponent that the UGroomComponent contains, and call AdvanceSimulation and TickComponent on them.

I tried doing this in all possible tick groups.

Another thing that i noticed is, that when i check the “visible in scene capture only” on the groom component, the hair will not be visible at all.

It seems to me, that the metahuman grooms rely on world rendering to work properly.
Is there way, to make them work properly with USceneCaptureComponent2D only?

So far i didn’t find any solution to this, so i will try a workaround.

I’ve encountered the same issue and investigated its root cause. Groom components rely on a Niagara component for simulation under the hood, and all groom assets are evaluated together in a single batch. This simulation runs on the GPU, which explains why adjusting the tick order does not resolve the problem—the simulation update occurs on the render/RHI thread rather than the game thread.

Because the simulation is integrated into the main scene rendering pass, disabling the main viewport rendering also disables the groom simulation.

Here is the frame capture (DUMPGPU) of a frame in my game


I didn’t solve the issue yet but I’m ensure that this requires some engine adjustments. Even if so I write down the solution as soon as I find it.