Bug Description
Nyx's GLB import path appears to alias embedded material state across distinct GLB meshes in the same scene when the GLBs reuse the same embedded material names.
The attached hermetic repro generates two tiny GLBs procedurally:
asset_a.glb: a large white quad with a smaller red square on top
asset_b.glb: the same geometry but with a smaller blue square on top
Both files intentionally reuse the same embedded GLB names:
- scene:
world
- nodes:
Ground_0, grass_part_0
- meshes:
Ground_0, grass_part_0
- materials:
ground_dirt, Material_0
The minimal Genesis + Nyx scene is otherwise identical in every case: static mesh entity/entities plus one Nyx camera.
Observed behavior:
asset_a.glb alone renders the red inner square correctly.
asset_b.glb alone renders the blue inner square correctly.
- If
asset_b.glb is loaded first and hidden, then asset_a.glb is loaded and rendered, the resulting image is pixel-identical to asset_b.glb, not asset_a.glb.
- If the repro changes only
asset_b.glb's embedded Material_0 name to a unique value, asset_a.glb renders correctly again.
This suggests Nyx is keying or reusing GLB material state by embedded material name (Material_0) across distinct files, instead of by file-local material identity.
Steps to Reproduce
Run the attached repro.py in an environment with:
genesis-world
gs-nyx
gs-nyx-plugin
numpy
Pillow
pygltflib
trimesh
Command:
python repro.py --out-dir out
The script is fully hermetic:
- it generates both GLBs procedurally at runtime
- it does not depend on any external assets
- it uses the same minimal Genesis + Nyx scene for all cases
- the only behavior change between the failing and fixed cases is renaming the sibling GLB's embedded
Material_0
Expected output summary:
{
"asset_a_after_b_vs_asset_a_single": [nonzero, nonzero],
"asset_a_after_b_vs_asset_b_single": [0.0, 0.0],
"asset_a_after_b_material_0_unique_vs_asset_a_single": [0.0, 0.0]
}
The script also writes a 4-panel image:
A single
B single
A after B
A after B unique
where A after B matches B single, and A after B unique matches A single.
Panel produced by the current repro bundle:
Relevant log output
The repro consistently emits:
[WARNING][Transform Component] Multiple references at pointing to the same instance.
[ERROR][NYX][ASSERT_FAILURE] Failed to export shader library.
The material aliasing behavior reproduces even though the scene contains only two simple static GLBs and one camera.
Environment
- OS: Ubuntu 22.04
- GPU/CPU: NVIDIA RTX 5000 Ada / AMD Threadripper 7970X
- GPU-driver version: 570.211.01
- CUDA / CUDA-toolkit version: host CUDA runtime 12.8
- Python: 3.13.11
Release version or Commit ID
genesis-world==1.2.0
gs-nyx==0.1.2
gs-nyx-plugin==0.1.3
pygltflib==1.16.0
trimesh==4.9.0
Additional Context
The key control in this repro is very narrow:
- renaming only the sibling GLB's
Material_0 fixes the rendering
- renaming node names and mesh names is not required for the fix
- the geometry, textures, transforms, and scene structure remain the same
That makes the likely failure mode fairly specific: cross-file GLB material aliasing by embedded material name.
Bug Description
Nyx's GLB import path appears to alias embedded material state across distinct GLB meshes in the same scene when the GLBs reuse the same embedded material names.
The attached hermetic repro generates two tiny GLBs procedurally:
asset_a.glb: a large white quad with a smaller red square on topasset_b.glb: the same geometry but with a smaller blue square on topBoth files intentionally reuse the same embedded GLB names:
worldGround_0,grass_part_0Ground_0,grass_part_0ground_dirt,Material_0The minimal Genesis + Nyx scene is otherwise identical in every case: static mesh entity/entities plus one Nyx camera.
Observed behavior:
asset_a.glbalone renders the red inner square correctly.asset_b.glbalone renders the blue inner square correctly.asset_b.glbis loaded first and hidden, thenasset_a.glbis loaded and rendered, the resulting image is pixel-identical toasset_b.glb, notasset_a.glb.asset_b.glb's embeddedMaterial_0name to a unique value,asset_a.glbrenders correctly again.This suggests Nyx is keying or reusing GLB material state by embedded material name (
Material_0) across distinct files, instead of by file-local material identity.Steps to Reproduce
Run the attached
repro.pyin an environment with:genesis-worldgs-nyxgs-nyx-pluginnumpyPillowpygltflibtrimeshCommand:
The script is fully hermetic:
Material_0Expected output summary:
{ "asset_a_after_b_vs_asset_a_single": [nonzero, nonzero], "asset_a_after_b_vs_asset_b_single": [0.0, 0.0], "asset_a_after_b_material_0_unique_vs_asset_a_single": [0.0, 0.0] }The script also writes a 4-panel image:
A singleB singleA after BA after B uniquewhere
A after BmatchesB single, andA after B uniquematchesA single.Panel produced by the current repro bundle:
Relevant log output
The repro consistently emits:
The material aliasing behavior reproduces even though the scene contains only two simple static GLBs and one camera.
Environment
Release version or Commit ID
genesis-world==1.2.0gs-nyx==0.1.2gs-nyx-plugin==0.1.3pygltflib==1.16.0trimesh==4.9.0Additional Context
The key control in this repro is very narrow:
Material_0fixes the renderingThat makes the likely failure mode fairly specific: cross-file GLB material aliasing by embedded material name.