Fixing the level of detail

I’m working on an application that needs to display only small regions of the globe, clipped with globe.cartographicLimitRectangle. I want to fix the LOD of textures to avoid these visual issues with different levels being clearly visible:


I tried setting globe.maximumScreenSpaceError, but the result is still almost the same.

I have a few constraints to help. The region is fixed and small (a few kms on each side). I can control the zoom range, which will not get too close. I’d be okay with a longer load time, prefetching a larger number of tiles, as long as I get a smoother run, without replacing tiles that are visible. If possible, I’d like to do the same LOD locking with the mesh, not only the texture. So, questions:

  • is there a way to lock the terrain texture and/or mesh at a fixed LOD, so they don’t change according to the camera zoom?
  • if this is not possible, is there a way to replace the ImageProvider with my own that would guarantee a smoother experience? For example, I could generate textures myself, but I’m worried that although it fixes the color differences in different tile levels, fetching the textures later will generate a “it’s pixelated, wait, now it looks good again” effect. I’m looking for an immediate effect like a mip-map. Again, I’m fine with a longer load time as long as it is smooth while running.
  • as a last resort, would it be viable to use a single, high-res tile instead? I could control the server and write a provider that has only one level of detail. If this works, any pointers to documentation or examples? I couldn’t find much information about this approach.

Any tips are appreciated, thank you!

Hi there,

I’m assuming you’re using the default imagery, Bing, on terrain, correct?

The tile boundaries at different LODs can be fairly obvious as the data seems to have been collected at different times of day and under different lightning conditions.

One thing you could try is other imagery providers, such as Sentinel-2. You could also upload your own imagery to Cesium ion, which handles tiling the imagery and hosting it.

You could also handle this in CesiumJS by creating a custom ImageryProvider which implements specific values for maximumLevel and minimumLevel.

You could definitely set up your own imagery provider server. Though the details of hosting or creating the server is out of scope of CesiumJS itself, the protocol is standard.

1 Like