Skip to content

Add EXT_meshopt_compression support on Editor / Standalone / Android / WSA (libmeshoptimizer is currently bundled only for iOS and WebGL) #694

Description

@cedrickamermans

Feature

Summary

Cesium for Unity silently fails to render glTF tiles that require EXT_meshopt_compression on every platform except
iOS and WebGL. The tile hierarchy populates and metadata extensions (EXT_structural_metadata, EXT_mesh_features)
are honored, but the geometry buffers are dropped, leaving placeholder GameObjects with CesiumModelMetadata and no
MeshFilter / MeshRenderer children. The same tilesets render fine in CesiumJS.

Reproduction

  • Package: com.cesium.unity 1.23.2 (registry), commit hash AA71215DE0C4 in Library/PackageCache.
  • Unity: 6000.x, Windows 11 Editor, HDRP project.
  • Steps:
    1. Add a Cesium3DTileset under a CesiumGeoreference with origin in Amsterdam.
    2. Set Source = From Url, URL = https://data.3dbag.nl/v20250903/cesium3dtiles/lod22/tileset.json.
    3. Place a properly georeferenced camera over the dataset.
  • Expected: Buildings render, as they do in CesiumJS.
  • Actual: ~259 tile-placeholder GameObjects are added under the tileset, each with only Transform +
    CesiumModelMetadata. Zero MeshFilter / MeshRenderer are created anywhere in the subtree. No errors are logged;
    ComputeLoadProgress() returns 100.

Evidence the cause is missing meshoptimizer on desktop

Inspecting an individual tile GLB header (https://data.3dbag.nl/v20250903/cesium3dtiles/lod22/t/4/384/896.glb):

"extensionsRequired": ["EXT_meshopt_compression", "KHR_mesh_quantization"]
"extensionsUsed":     ["EXT_mesh_features", "EXT_meshopt_compression",
                       "KHR_mesh_quantization", "EXT_structural_metadata"]

All vertex/index buffer views are stored as EXT_meshopt_compression blobs.

Searching the installed package for the meshopt decoder library:

./Plugins/iOS/lib/libmeshoptimizer.a
./Plugins/WebGL/lib/libmeshoptimizer.a

libmeshoptimizer is present only for iOS and WebGL. There is no equivalent binary under Editor/x86_64, Editor/arm64,
Plugins/Standalone, Plugins/Android, or Plugins/WSA. Because EXT_meshopt_compression is declared in
extensionsRequired, cesium-native must skip the geometry on builds where the decoder isn't linked, which matches the
observed behavior exactly (metadata processes, geometry doesn't).

Cross-check with CesiumJS

The same tileset URL renders correctly in CesiumJS 1.133 in a browser, because CesiumJS ships its own meshopt decoder.
 So the dataset is conformant; only the Cesium for Unity desktop/Android/WSA path is affected.

Impact

3DBAG (Dutch national 3D buildings) and other open 3D Tiles publishers increasingly emit meshopt-compressed GLBs
because it dramatically reduces transfer size. Users who can't or don't want to round-trip through Cesium Ion's
transcoding pipeline currently have no working option on the Unity Editor or any desktop/Android target — they only
discover this after the tileset appears to "load" (because metadata processes) but renders nothing.

Suggested fix

Link libmeshoptimizer into the cesium-native builds for the remaining platforms (Editor/x86_64, Editor/arm64,
Plugins/Standalone/*, Plugins/Android/*, Plugins/WSA/*) and ship the binaries with the package, the same way the iOS
and WebGL builds already do. The cesium-native side already knows how to call the decoder — it's purely a
build/packaging gap, not a code-change in the loader.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds triageNew issues in need of triage to determine reproducibility, scope, and urgency

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions