Skip to content

[Bug]: Nyx aliases GLB materials across distinct meshes when embedded material names match #17

Description

@NoahLinckeScout

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:

Image

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions