Description

In the SkeletalMeshBuilder, Nanite is generated when enabled regardless of the LOD being requested. Since the Nanite enablement parameter is set on all LODs in USkeletalMesh::BuildLODModel and LODs are built from 0 to the final LOD level, the Nanite resource ends up populated with the Nanite result of the final LOD level.

This is confirmed to affect 5.5.1 from the EGL and ue5-main at commit 43a7d3325ddb06925a5934c615561235a778f6fc/CL 39175013.

Steps to Reproduce

1. Either import a mesh with LODs, or use a mesh from the asset store with non-generated LODs
2. Enable Nanite on the SkeletalMesh
3. Place in level (Editor view for SkeletalMesh doesn't show Nanite)

Expected Result: Nanite-enabled Skeletal Mesh at full fidelity
Actual Result: The Nanite version of the mesh is generated from the highest LOD and looks significantly degraded

Callstack

Below is the callstack of the point where Nanite is built.

FSkeletalMeshBuilder::Build(const FSkeletalMeshBuildParameters &) SkeletalMeshBuilder.cpp:296
FMeshBuilderModule::BuildSkeletalMesh(const FSkeletalMeshBuildParameters &) MeshBuilderModule.cpp:81
USkeletalMesh::BuildLODModel(const ITargetPlatform *, int) SkeletalMesh.cpp:6095
FSkeletalMeshRenderData::Cache(const ITargetPlatform *, USkinnedAsset *, FSkinnedAssetCompilationContext *) SkeletalMeshRenderData.cpp:316
USkeletalMesh::CacheDerivedData(FSkinnedAssetCompilationContext *) SkeletalMesh.cpp:5198
USkeletalMesh::ExecuteBuildInternal(FSkinnedAssetBuildContext &) SkeletalMesh.cpp:2179
FSkinnedAssetAsyncBuildWorker::DoWork() SkinnedAssetAsyncCompileUtils.cpp:43
FAsyncTaskBase::DoWork() AsyncWork.h:288
FAsyncTaskBase::DoThreadedWork() AsyncWork.h:312
FQueuedThreadPoolWrapper::FScheduledWork::DoThreadedWork() QueuedThreadPoolWrapper.h:142
FQueuedThreadPoolWrapper::FScheduledWork::DoThreadedWork() QueuedThreadPoolWrapper.h:142
[Inlined] FQueuedLowLevelThreadPool::AddQueuedWork::__l2::<lambda_1>::operator()() QueuedThreadPoolWrapper.h:484
R<lambda_1>@?N@?$Init@V<lambda_1>@?1??AddQueuedWork@FQueuedLowLevelThreadPool@@EEAAXPEAVIQueuedWork@@W4EQueuedWorkPriority@@@Z@@FTask@LowLevelTasks@@QEAAXPEB_WW4ETaskPriority@2@$$QEAV0?1??AddQueuedWork@FQueuedLowLevelThreadPool@@EEAAXPEAVIQueuedWork@@W4EQueuedWorkPriority@@@Z@W4ETaskFlags@2@@Z@QEAAPEAV12@_N@Z(const bool) Task.h:499
[Inlined] Invoke(LowLevelTasks::FTask::<lambda_1> &, bool &) Invoke.h:47
[Inlined] LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`FQueuedLowLevelThreadPool::AddQueuedWork'::`2'::<lambda_1> >'::`13'::<lambda_1>,0>::Call(void *,bool) TaskDelegate.h:162
?CallAndMove@?$TTaskDelegateImpl@V<lambda_1>@?N@???$Init@V<lambda_1>@?1??AddQueuedWork@FQueuedLowLevelThreadPool@@EEAAXPEAVIQueuedWork@@W4EQueuedWorkPriority@@@Z@@FTask@LowLevelTasks@@QEAAXPEB_WW4ETaskPriority@3@$$QEAV1?1??AddQueuedWork@FQueuedLowLevelThreadPool@@EEAAXPEAVIQueuedWork@@W4EQueuedWorkPriority@@@Z@W4ETaskFlags@3@@Z@$0A@@?$TTaskDelegate@$$A6APEAVFTask@LowLevelTasks@@_N@Z$0DA@@LowLevelTasks@@UEAAPEAVFTask@3@AEAV23@PEAXI_N@Z(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48> &,void *,unsigned int,bool) TaskDelegate.h:171
[Inlined] LowLevelTasks::TTaskDelegate::CallAndMove(LowLevelTasks::TTaskDelegate<…> &, bool) TaskDelegate.h:308
LowLevelTasks::FTask::ExecuteTask() Task.h:627
LowLevelTasks::FScheduler::ExecuteTask(LowLevelTasks::FTask *) Scheduler.cpp:245
[Inlined] LowLevelTasks::FScheduler::TryExecuteTaskFrom(LowLevelTasks::Private::FWaitEvent *, LowLevelTasks::Private::TLocalQueueRegistry<…>::TLocalQueue *, LowLevelTasks::Private::FOutOfWork &, bool) Scheduler.cpp:457
LowLevelTasks::FScheduler::WorkerLoop(LowLevelTasks::Private::FWaitEvent *, LowLevelTasks::Private::TLocalQueueRegistry<…>::TLocalQueue *, unsigned int, bool) Scheduler.cpp:514
[Inlined] LowLevelTasks::FScheduler::WorkerMain(LowLevelTasks::Private::FWaitEvent *, LowLevelTasks::Private::TLocalQueueRegistry<…>::TLocalQueue *, unsigned int, bool) Scheduler.cpp:571
`LowLevelTasks::FScheduler::CreateWorker'::`2'::<lambda_1>::operator()() Scheduler.cpp:75
[Inlined] UE::Core::Private::Function::TFunctionRefBase::operator()() Function.h:470
FThreadImpl::Run() Thread.cpp:66
FRunnableThreadWin::Run() WindowsRunnableThread.cpp:156
FRunnableThreadWin::GuardedRun() WindowsRunnableThread.cpp:71
<unknown> 0x00007ff89da6e8d7
<unknown> 0x00007ff89e25fbcc

Have Comments or More Details?

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

0
Login to Vote

Unresolved
ComponentUE - Graphics Features - Nanite
Affects Versions5.65.5
Target Fix5.6
CreatedJan 14, 2025
UpdatedJan 20, 2025
View Jira Issue