Skip to content

Instanced Mesh GPU

App: apps/instanced_mesh_gpu/

Demonstrates true GPU instancing via Vulkan SSBO. A 3D grid of up to 1,000 cube instances is rendered in a single draw call. Instance positions are updated each frame with a sine-wave animation.

Terminal window
% ./plume3d instanced_mesh_gpu

or

Terminal window
% ./../plume3d .
  • Creates a cube mesh programmatically (Mesh.new(vertices, "triangles")).
  • Creates an InstancedMesh via Scene.createInstancedMesh("gpu_cubes").
  • Enables GPU instancing: instanced.useGpuInstancing = true — a single Vulkan draw call handles all instances via SSBO.
  • Sets a PBR material: instanced.setMaterial(r, g, b, a, metallic, roughness).
  • Populates a 3D grid with addInstance(x, y, z).
  • Each frame in update(dt), uses setInstancePosition(index, x, y, z) to apply a sine-wave offset per column.
// Setup
_instanced = _scene.createInstancedMesh("gpu_cubes")
_instanced.setMesh(_cubeMesh)
_instanced.useGpuInstancing = true
_instanced.setMaterial(0.2, 0.6, 0.9, 1.0, 0.0, 0.3)
for (i in 0..._instanceCount) {
_instanced.addInstance(x, 0, z)
}
// Per frame
for (i in 0..._instanced.instanceCount) {
var wave = Math.sin(_time * 2 + x * 0.3 + z * 0.3) * 0.3
_instanced.setInstancePosition(i, x, y + wave, z)
}
  • InstancedMeshcreateInstancedMesh, setMesh, useGpuInstancing, setMaterial, addInstance, setInstancePosition, instanceCount.
  • ScenecreateInstancedMesh.
  • Meshnew(vertices, drawMode) for procedural cube.
  • Mathsin.
  • Replace the cube mesh with any loaded .blend mesh via setMeshFromNode(node).
  • Use setInstanceTransform(index, matrix) to apply full rotation and scale per instance.
  • Use setInstanceTransforms(matrices, count) for bulk updates from a physics simulation.
  • Combine with ParticleEmitter — particles also use instanced meshes internally, driven by Jolt physics bodies.