Renderer · type

ParticleBlend

One draw call for a live particle pool: one camera-facing quad per particle, or a crossed pair of world-fixed ones when facing asks for them.

Explained in Hello world.

type ParticleBlend = 'additive' | 'alpha'
import type { ParticleBlend } from '@driftengine/core';

In depth

Instanced: the cross is uploaded once as eight vertices, and each frame only the per-particle stream is re-sent. That is the difference between this and the scatter path it replaces — InstancedMesh is built for data that never changes after placement, and a particle system's data changes entirely every frame.

Blending and depth are the batch's own decision because they are a property of the material: smoke occludes what is behind it and sparks add to it, and a caller that had to remember which would eventually forget. Neither writes depth — a soft particle that did would punch a hole in everything drawn after it.