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;
Call stack (top):
UnrealEditor-HairStrandsCore.dll!RunHairStrandsInterpolation_Cards(...) line 2011 check(InstanceData.CardInstance->Guides.RestResource);
Reproduction steps (sample project):
Note: The crash does not occur if the Groom Cache assignment is removed.
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]
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-382081 in the post.
| 0 |
| Component | UE - Rendering - Graphics Features |
|---|---|
| Affects Versions | 5.7, 5.8 |
| Created | May 29, 2026 |
|---|---|
| Updated | Jun 3, 2026 |