Description

Summary

  • Merging a Skeletal Mesh whose LOD streaming has not completed crashes with an AccessViolation while the vertex copy reads the Null buffers of LODs that have not been streamed in
  • Root cause is that FSkeletalMeshMerge processes LODRenderData without checking the load state of source LODs
  • Requesting a source LOD validation option for the merge that either returns failure or automatically restricts the merge to the loaded LOD range when the condition is not met
  • Requesting a feature that, when merging meshes that use LOD streaming, requests streaming for any LODs that have not been streamed in and merges either synchronously after completion or asynchronously once streaming completes

Description

  • For streamable LODs, only RenderSections and buffer metadata are included in the package while the buffer payloads are split into StreamingBulkData
  • Even before streaming, PositionVertexBuffer.GetNumVertices() returns the actual vertex count, so the copy range check in GenerateLODModel() does not filter it out and CopyVertexFromSource() reads Null data
  • Rendering blocks access to unloaded LODs via CurrentFirstLODIdx , but the merge path has no equivalent handling
  • Requesting a feature where the merge itself requests streaming when any LOD has not been streamed in
  • Synchronous mode waits for streaming to complete before merging, and asynchronous mode merges and invokes a callback once streaming completes

Additional Notes

As a workaround, the Normal path guarantees all LODs are loaded before merging with the code below

[Image Removed]

Steps to Reproduce

Steps to Reproduce

  1. Extract the attached MergeRepro project
  2. Run Setup.bat to build, create the repro asset, and package
  3. Run RunCrashMerge.bat
  4. Check the log at Saved/Logs/MergeRepro-Crash.log
  5. Check the Call Stack and crash dump under Saved/StagedBuilds/Windows/MergeRepro/Saved/Crashes

Repro conditions configured by Setup.bat

  • Config/DefaultEngine.ini: r.MeshStreaming=True
  • A duplicate of SKM_Quinn_Simple at /Game/Repro/SKM_StreamedSource with bOverrideLODStreamingSettings=true, bSupportLODStreaming=true, MaxNumStreamedLODs=8
  • After cooking, only the last LOD is inlined while LOD0 and LOD1 are split into .ubulk
  • Windows Development packaged build

Repro code executed by RunCrashMerge.bat

[Image Removed]

  • The mesh is merged right after loading without being assigned to any Component, so stream in has not started

Skeletal Mesh LOD streaming does not run in the Editor and PIE, so the crash reproduces only in a packaged build.

Results

RunCrashMerge.bat

Exit code 3 . Source Mesh state right before the merge

[Image Removed]

  • Only the last LOD is loaded while LOD0 and LOD1 have only vertex count metadata and no buffer data
  • Calling the merge produces the crash below

[Image Removed]

RunNormalMerge.bat

  • Merges the same Mesh successfully after streaming completes and returns exit code 0
  • Merged LOD0 vertex count 91986 = source 45993 x 2

Expected

  • When any LOD has not been streamed in, return failure without crashing or merge only the loaded LOD range
  • Log output that identifies the failure cause
  • Document the all LODs loaded precondition in the USkeletalMergingLibrary::MergeMeshes() comment

Have Comments or More Details?

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

0
Login to Vote

Unresolved
CreatedJul 24, 2026
UpdatedJul 24, 2026
View Jira Issue