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).

Hi @Chris_Morris,
I’m not sure what might be happening there. Since it looks like you’re loading a tileset from Cesium ion, would you mind (privately) sharing the asset ID and access token with us? If so, please also state that we have your permission to access it for debugging purposes.

Sure thing. I have sent you a private message. Please let me know if there is anything else I can provide or do.

Hi @Chris_Morris,

Thanks for providing the details of your tilesets. I took a look, and the reason they don’t appear is that they use “multiple contents”. This means that tiles in your tileset.json have a "contents" property which is an array of glTFs. Unfortunately, Cesium Native / Cesium for Unreal currently only support the "content" property, which specifies a single glTF.

Here’s the enhancement request to add support for multiple contents:

1 Like

Trying to load a tileset that uses multiple contents should at the very least print a message like “This tileset uses multiple contents, which are currently not supported, that’s why you won’t see anything”.

That said: It should be fairly trivial that create a short script, based on the 3d-tiles-tools, that converts the given tileset into one that does not use multiple contents. If that could help here, just drop me a note.

1 Like

Thanks, but this is from a custom script I wrote that takes 3D vector data from a KML and converts it into glTFs and then into a Cesium tileset format. I’ve actually got it working once the issue was pointed out. Small picture of it in Unreal now, can’t show the full thing for privacy reasons but it works! Need to adjust some of the bounding volumes and stuff to make it look right but that should be easy.

Thank you both for the help!

1 Like