When a tileset.json contains multiple GLB files, how can we distinguish between them in the shader?
I’ve tried using:
vsInput.featureIds.SELECTED_FEATURE_ID → Features from different tileModels (GLB files) end up having identical IDs
vsInput.featureIds.featureId_0 → Throw errors when loading the tileset
Note: Both approaches work fine when the tileset contains just a single GLB.


2 Features have same id In different BatchTable, I can’t get current feature in CustomShader
I’m implementing model editing functionality using tileset.CustomShader (for Revit models converted to 3D Tiles), aiming to enable simple web-based editing and sharing of models, scene trees, and associated properties. This issue has become a significant roadblock in my project.
By reviewing the source code, I discovered that:
When using the glTF extension EXT_instance_features , the feature ID appears in featureIds.instanceFeatureId_0 . However, when accessing the FeatureID this way, the same issue persists as with the macro SELECTED_FEATURE_ID —I cannot distinguish between multiple parts that share the same Feature_id (as shown in the second image, where two features move simultaneously).
Hi @tianyu.lttty,
Thanks for your post and welcome to the Cesium community.
Thank you for the detailed description of the problem you shared. First question, how are you generating your GLB files and combining them into a 3DTileset? If you control the process, perhaps you could make use the label property for feature IDs. From the CesiumJS Custom Shader guide:
If a set of feature IDs includes a label property (new in EXT_mesh_features), that label will be available as an alias. For example, if label: "alias", then (vsInput|fsInput).featureIds.alias would be available in the shader along with featureId_N.
Would this approach be a possible solution for you? If not please let us know you constraints so we can better understand your use case.
I hope we can help find a solution shortly.
Best,
Luke
Thank you so much for your insightful guidance! Your response was truly illuminating—the document snippet you referenced, along with its context, served as a “lighthouse” that helped me navigate to a solution.
After carefully evaluating my controllable pipeline (Revit → GLB → 3D Tiles), I’ve successfully implemented an efficient “model component manipulation” feature. This allows real-time control over feature positions and attributes in the web client, which is critical for my use case.

Next, I plan to implement GUI controls to enable lightweight model editing functionality - similar to Three.js-based platforms - by combining component IDs from sceneTree.json (exported from *.rvt files) with mouse drag interactions. I’ve been searching for ways to achieve this within Cesium’s environment but hadn’t found a approach until now.
Your expertise has been invaluable—thank you for fostering such a supportive community!
Best regards!