Description

Playing a Guides Groom Cache while Card Mesh LOD (Guide-Based) is active causes an assert in RunHairStrandsInterpolation_Cards when the renderer switches to Card LOD.

Assert location: Plugins/Runtime/HairStrands/Source/HairStrandsCore/Private/GroomManager.cpp:2011

check(InstanceData.CardInstance->Guides.RestResource);

Root cause:
Card LOD guide resources are not created when only Groom Cache drives deformation (no simulation, graph deformer, global interpolation, or skinning binding).

In GroomComponent.cpp (~line 3219), bNeedDeformedPositions for Card LOD omits bIsSimulationCacheEnable:

const bool bNeedDeformedPositions = bHasSimulation || bHasDeformation || bHasGlobalDeformation || BindingType == EHairBindingType::Skinning;

When this is false, InstanceLOD.Guides.RestResource and related Card LOD guide resources are never assigned (~lines 3256–3277).

Proposed fix:
Add Groom Cache to Card LOD initialization in GroomComponent.cpp:

const bool bNeedDeformedPositions =
    bHasSimulation || bHasDeformation || bHasGlobalDeformation
    || BindingType == EHairBindingType::Skinning
    || HairGroupInstance->HairGroupPublicData->bIsSimulationCacheEnable;
Steps to Reproduce
  1. Use UE 5.7.4 (Editor).
  2. Set up a Groom asset with Card Mesh LOD configured as Guide-Based, per [Link Removed].
  3. Import or assign a Guides Groom Cache (not Strands cache).
  4. Place a Groom Component, assign the Groom asset and Guides Groom Cache, and play the cache.
  5. Ensure the view switches to Card LOD (e.g. move camera away or adjust LOD so Card LOD is active).
  6. Expected: Card LOD renders with Groom Cache deformation applied.
  7. Actual: Assert on render thread when Card LOD becomes active.

Call stack (top):

UnrealEditor-HairStrandsCore.dll!RunHairStrandsInterpolation_Cards(...) line 2011
  check(InstanceData.CardInstance->Guides.RestResource);

Reproduction steps (sample project):

  1. Download the sample project from the [Link Removed]and launch the Editor.
  2. Pull the camera back to show the Cards LOD — the Editor crashes.

Note: The crash does not occur if the Groom Cache assignment is removed.

Callstack
	UnrealEditor-HairStrandsCore.dll!RunHairStrandsInterpolation_Cards(FRDGBuilder & GraphBuilder, FSceneInterface * Scene, const TArray<FSceneView const *,TSizedDefaultAllocator<32>> & Views, const FSceneView * View, const unsigned int ViewUniqueID, const TArray<TRefCountPtr<FHairStrandsInstance>,TSizedDefaultAllocator<32>> & Instances, const FShaderPrintData * ShaderPrintData, FHairTransientResources & TransientResources, FGlobalShaderMap * ShaderMap) Line 2036	C++
 	UnrealEditor-HairStrandsCore.dll!ProcessHairStrandsBookmark(FRDGBuilder * GraphBuilder, EHairStrandsBookmark Bookmark, FHairStrandsBookmarkParameters & Parameters) Line 3562	C++
 	UnrealEditor-Renderer.dll!FDeferredShadingSceneRenderer::Render(FRDGBuilder & GraphBuilder, const FSceneRenderUpdateInputs * SceneUpdateInputs) Line 2409	C++
 	UnrealEditor-Renderer.dll!RenderViewFamily_RenderThread(FRDGBuilder & GraphBuilder, FSceneRenderer * Renderer, const FSceneRenderUpdateInputs * SceneUpdateInputs) Line 5239	C++
 	[Inline Frame] UnrealEditor-Renderer.dll!FRendererModule::BeginRenderingViewFamilies::__l130::<lambda_4>::operator()(FRDGBuilder &) Line 5534	C++
 	UnrealEditor-Renderer.dll!FRendererModule::BeginRenderingViewFamilies'[::C]::<lambda_4>::<lambda_invoker_cdecl>(FRDGBuilder & GraphBuilder, const FSceneRenderFunctionInputs & Inputs) Line 5536	C++  	[Inline Frame] UnrealEditor-Renderer.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,bool __cdecl(FRDGBuilder &,FSceneRenderFunctionInputs const &)>::operator()(FRDGBuilder &) Line 414	C++  	UnrealEditor-Renderer.dll!FSceneRenderProcessor::Execute::__l32::<lambda_4>::operator()(FRHICommandListImmediate & RHICmdList) Line 895	C++  	UnrealEditor-RenderCore.dll!ExecuteCommand(FRHICommandList * RHICmdList, const TVariant<TUniqueFunction<void __cdecl(void)>,TUniqueFunction<void __cdecl(FRHICommandList &)>,TUniqueFunction<void __cdecl(FRHICommandListImmediate &)>> & Function, const FRenderCommandTag & Tag) Line 1531	C++  	[Inline Frame] UnrealEditor-RenderCore.dll!FRenderThreadCommandPipe::ExecuteCommands::__l2::<lambda_1>::operator()(TVariant<TUniqueFunction<void __cdecl(void)>,TUniqueFunction<void __cdecl(FRHICommandList &)>,TUniqueFunction<void __cdecl(FRHICommandListImmediate &)>> &&) Line 1939	C++  	UnrealEditor-RenderCore.dll!UE::RenderCommandPipe::FCommandList::ConsumeCommands<FRenderThreadCommandPipe::ExecuteCommands'::`2'::<lambda_1>>(const FRenderThreadCommandPipe::ExecuteCommands::__l2::<lambda_1> & Lambda) Line 335	C++
 	[Inline Frame] UnrealEditor-RenderCore.dll!FRenderThreadCommandPipe::ExecuteCommands(UE::RenderCommandPipe::FCommandList &) Line 1937	C++
 	UnrealEditor-RenderCore.dll!FRenderThreadCommandPipe::EnqueueAndLaunch::__l5::<lambda_1>::operator()() Line 1926	C++
 	[Inline Frame] UnrealEditor-RenderCore.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(void)>::operator()() Line 414	C++
 	[Inline Frame] UnrealEditor-RenderCore.dll!TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTaskImpl(TUniqueFunction<void __cdecl(void)> &) Line 1108	C++
 	[Inline Frame] UnrealEditor-RenderCore.dll!TFunctionGraphTaskImpl<void __cdecl(void),1>::DoTask(ENamedThreads::Type) Line 1101	C++
 	UnrealEditor-RenderCore.dll!TGraphTask<TFunctionGraphTaskImpl<void __cdecl(void),1>>::ExecuteTask() Line 703	C++
 	UnrealEditor-Core.dll!UE::Tasks::Private::FTaskBase::TryExecuteTask() Line 524	C++
 	[Inline Frame] UnrealEditor-Core.dll!FBaseGraphTask::Execute(TArray<FBaseGraphTask *,TSizedDefaultAllocator<32>> &) Line 493	C++
 	UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksNamedThread(int QueueIndex, bool bAllowStall) Line 807	C++
 	UnrealEditor-Core.dll!FNamedTaskThread::ProcessTasksUntilQuit(int QueueIndex) Line 696	C++
 	UnrealEditor-RenderCore.dll!RenderingThreadMain(FEvent * TaskGraphBoundSyncEvent) Line 261	C++
 	UnrealEditor-RenderCore.dll!FRenderingThread::Run() Line 417	C++
 	UnrealEditor-Core.dll!FRunnableThreadWin::Run() Line 167	C++
 	UnrealEditor-Core.dll!FRunnableThreadWin::GuardedRun() Line 79	C++
 	[External Code]	

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-382081 in the post.

0
Login to Vote

Unresolved
ComponentUE - Rendering - Graphics Features
Affects Versions5.75.8
CreatedMay 29, 2026
UpdatedJun 3, 2026
View Jira Issue