Instancing
Efficiently render thousands of lines with a single draw call using GPU instancing.
Overview
MeshLine's instancing capabilities help to render many lines efficiently.
Instead of creating separate mesh / geometries / material for each line, instancing reuses a single geometry with per-instance attributes so we can customize each lines.
Performance Benefits
Traditional Approach
- 1000 lines = 1000 draw calls
- High CPU overhead
- Poor GPU utilization
Instanced Approach
- 1000 lines = 1 draw call
- Minimal CPU overhead
- Optimal GPU utilization
Basic Implementation
javascript
import { MeshLine, circlePositions } from 'makio-meshline'
// Create instanced MeshLine
const instanceCount = 1000
const line = new MeshLine()
.lines( circlePositions(32) )
.instanceCount( instanceCount )
.lineWidth( 0.02 )
.build()
// Add custom instance attributes
line.addInstanceAttribute( 'instanceOffset', 3 ) // vec3
line.addInstanceAttribute( 'instanceColor', 3 ) // vec3
line.addInstanceAttribute( 'instanceScale', 1 ) // float
// Set instance data
for ( let i = 0; i < instanceCount; i++ ) {
// Position each instance
const angle = (i / instanceCount) * Math.PI * 2
const radius = 5 + Math.random() * 10
line.setInstanceValue( 'instanceOffset', i, [
Math.cos(angle) * radius,
(Math.random() - 0.5) * 10,
Math.sin(angle) * radius
])
// Random color
line.setInstanceValue( 'instanceColor', i, [
Math.random(),
Math.random(),
Math.random()
])
// Random scale
line.setInstanceValue( 'instanceScale', i, 0.5 + Math.random() )
}
Advanced Usage with Hooks
javascript
// Use instance attributes in shader hooks
line.positionFn( Fn( ( [ pos, counter, offset ] ) => {
// Apply instance offset to vertex positions
return pos.add( offset )
} ) )
line.colorFn( Fn( ( [ baseColor, counter, instanceColor ] ) => {
// Use instance color
return vec4( instanceColor, 1.0 )
} ) )
line.widthFn( Fn( ( [ width, counter, side, scale ] ) => {
// Apply instance scale to line width
return width.mul( scale )
} ) )
Use Cases
- Particle Systems - Hair, grass, fur rendering
- Data Visualization - Large datasets, flow fields
- Generative Art - Thousands of animated strokes
- Scientific Visualization - Vector fields, streamlines
- Games - Trajectory trails, magic effects
Best Practices
- Batch Similar Lines - Group lines with same material properties
- Use Instance Attributes - Avoid creating unique geometries
- Update Efficiently - Modify only changed instance values
Instancing is essential for applications requiring many lines while maintaining smooth performance.