Clarification on refinement and child tiles


Myself and a coworker have differing views on how tile refinement behaves, and have read docs without coming to a consensus. We have a pipeline for producing HLOD 3d tiles from cad models, and are trying to establish how the content loading should work.

Firstly what is the correct terminology to use here? If a tile gets refined, are the children considered loaded? Active? Primed? What are the states that a tile can be in?

Consider this example: parent tile R (with refine:replace) has 3 children, A,B,C. C has refine:add. None of these have child tiles.

Which of these is correct given R is being refined, and all tiles are within the frustum?

  • A+B+C are all loaded (active?), and will all render
  • A and B are loaded and ready to render. C is only loaded and rendered if the SSE is desired by the viewer.
  • A, B and C are each individually decided whether or not they are rendered. Any combination of which is rendered exists, depending on SSE of each

Example 2: Exactly the above above, except R is refine:add

  • R+A+B+C will all render
  • R+A+B will render. C may or may not depending on the SSE
  • R+(any combination of A, B, C). Depending on SSE

Just to add a bit more context to this question: we’re wondering if refining R forces all children to render or whether there are some cases where that’s not true.

Consider R:REPLACE, it only makes sense that refining R forces all children to render. Doing anything else could cause gaps in the geometry upon refinement.

But consider R:ADD. Intuitively (at least for me), in this scenario it makes more sense for the viewer to consider the children for rendering independently based on their SSE. Since each child can bring in more detail without detracting from R’s content, it gives the viewer the power to make finer grained decisions about how to best allocate its resource budget to maximise view quality.

I presume that this is not the case, however, as I can’t see any mention of this behaviour. If it is not the case, but we would like to achieve this kind of rendering in cesium, should we be adding an extra layer of content-less parent tiles in between R and it’s children to achieve the independent additive behaviour described above:


When a parent tile’s SSE is too high, the tile is refined, which means that all of its children are visited and potentially loaded and rendered. There are really only two reasons a child of a refined tile won’t be loaded and rendered:

  1. The child tile is culled because it is outside the view frustum or immersed in fog. Such a tile won’t be rendered, and depending on the rendering engine and settings it also might not even be loaded.
  2. The child tile’s SSE is also too high, so it too will be refined and its children visited and loaded/rendered in its place.

This is true for both REPLACE and ADD refinement (except for the “in its place” really means “in addition to it” for ADD refinement).

CesiumJS and Cesium for Unreal generally don’t work from a “resource budget” but instead select the tiles they need based on the desired quality (SSE), with the assumption (usually but not always a good one) that there’s enough resources available to achieve the desired quality. In WebGL in particular it’s hard to tell when that’s not true, unfortunately.

In any case, if you want a situation where some children are more important than others and so appear before others, Chris’s proposal of adding an extra tile layer with different geometric error should do the trick for ADD refinement. For REPLACE it will lead to holes, of course.


1 Like

Thanks for the very clear clarification!