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
i have this problem UE4CC-Windows-58DC12AF4B97F057BD108FBFF569B2E9_0000
I am not able to find world outliner how to enable it?
What method is used to fill polygonal regions when drawing spline mesh at run time?
How does UMG set overlapping layouts?
Delay nodes occasionally don't fire the "Completed" output in a nativized build
Undefined sysmbol: typeinfo for AActor when cross-compile linux dedicated server on windows
How does TextureRenderTarget2D get TArray<uint8> type data?
How to achieve HLSL Multiple Render Target in Material blueprints?
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 |