Quick answer: Set instance_count = N first. Then loop set_instance_transform(i, Transform3D(...)).
MultiMeshInstance3D set to 1000 grass blades. Only ~50 visible. Transforms not set; instances overlap at origin.
The Fix
@onready var mm: MultiMesh = $MultiMeshInstance3D.multimesh
func _ready():
mm.transform_format = MultiMesh.TRANSFORM_3D
mm.use_colors = true
mm.instance_count = 1000
for i in 1000:
var pos = Vector3(randf_range(-50, 50), 0, randf_range(-50, 50))
mm.set_instance_transform(i, Transform3D(Basis(), pos))
mm.set_instance_color(i, Color(randf(), randf(), randf()))
instance_count + per-index transforms = visible variation. visible_instance_count caps rendered count if you want partial display.
Verifying
1000 distinct instances render. Without transforms: clump at origin.
“Set count. Set transforms. Spread.”
Related Issues
For shader uniform array, see uniform array. For shader UV flip, see UV flip.
Count + transforms. Crowd.