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.
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
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
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-238767 in the post.
0 |
Component | UE - Graphics Features - Nanite |
---|---|
Affects Versions | 5.6, 5.5 |
Target Fix | 5.6 |
Created | Jan 14, 2025 |
---|---|
Updated | Jan 20, 2025 |