3D Tiles Invisible In Unreal

I have a set of 3D tiles that are visible in CesiumJS in Cesium Ion. They are positioned correctly and look exactly as I would expect.

When attempting to add to Unreal they render as invisible. If I turn on wire frames and or bounding boxes nothing is displayed like it is for other 3D tile sets I have. In the picture below you can see one tile set outlined in the right corner in orange with lit wire frames. The other tile set should be about in the middle of the screen.

If I turn on “Draw Tile Info” and put the viewer into run mode I get some red text labels above where the missing tile set should be.

Looking at the log, it doesn’t throw any errors when loading the tiles from Cesium Ion:

LogCesium: Loading tileset for asset ID 1
LogCesium: Loading tileset for asset ID 1 done
LogCesium: Loading tileset for asset ID 3330335
LogCesium: Loading tileset for asset ID 3330335 done

Also the tile set passes the validator with 15 warnings, this error 15 times:

    {
      "type": "CONTENT_VALIDATION_WARNING",
      "path": "Data/Style1_0.glb",
      "message": "Data/Style1_0.glb caused validation warnings",
      "severity": "WARNING",
      "causes": [
        {
          "type": "CONTENT_VALIDATION_WARNING",
          "path": "Data/Style1_0.glb",
          "message": "Content Data/Style1_0.glb caused validation warnings",     
          "severity": "WARNING",
          "causes": [
            {
              "type": "CONTENT_VALIDATION_WARNING",
              "path": "/materials/0/alphaCutoff",
              "message": "Alpha cutoff is supported only for 'MASK' alpha mode.",
              "severity": "WARNING"
            }
          ]
        }
      ]
    },

Here is an example of it rendering in CesiumJS:

The tile set is comprised of 15 glb objects. Here is the glTF validation report for one from https://gltf-viewer.donmccurdy.com (which also renders the object without issue):

Validation report

    Format: glTF 2.0
    Generator: PlacemarkConverter
    Stats:
        1 draw calls
        0 animations
        1 materials
        3186 vertices
        1062 triangles
    Extensions:
        None

Report generated byKhronosGroup/glTF-Validator 2.0.0-dev.3.9.
Warning	Message	Pointer
MATERIAL_ALPHA_CUTOFF_INVALID_MODE	Alpha cutoff is supported only for 'MASK' alpha mode.	/materials/0/alphaCutoff

I’m not sure what other information is needed to troubleshoot or what the problem could be. I’ve tried it with and without KHR_mesh_quantization and CESIUM_RTC.

Does anyone have any idea what might be causing the discrepancy between Cesium JS and Unreal and what other directions I could look to troubleshoot?

Others will have to investigate the details and establish the mapping between the incoming data and the behavior.

In the meantime:

Which alpha mode do the glTF actually use? Is it OPAQUE or BLEND?

The point here is: Even though the message
“Alpha cutoff is supported only for ‘MASK’ alpha mode.”
is only a WARNING, it sounds like something that could explain the behavior: If the alpha mode is BLEND, then this could - depending on some lower-level details and possible default values - cause the tileset to be rendered ~“with a (completely) transparent material”, which might explain why nothing is visible.

(Note: Although the BLEND mode should work in principle, the fact that the warning is emitted might hint at some form of ~“inconsistency” in the data that might cause the unexpected behavior here)

Going out on a limb, you could try

  • assigning a custom material to the tileset (probably roughly as described in this post) and see whether the tileset is visible then
  • if the glTFs actually use BLEND, try out whether it works when they use MASK (or OPAQUE) instead

I iterated through the glTFs using pygltflib and they’re all opaque, I also updated my code to not apply an alphacutoff if the material is opaque.

Style9_8.glb: material[0] alphaMode = OPAQUE, alphaCutoff = <none>

I also modified my code to stop the mask in alpha mode. No warnings or errors on my 3d tile validation check:

Validation result:
{
  "date": "2025-04-27T20:37:14.794Z",
  "numErrors": 0,
  "numWarnings": 0,
  "numInfos": 0
}

Same result in Unreal with no wire frame, bounding box, or errors in the log (completely restarted the editor, refreshed the tileset).