Quick answer: Add render_mode particles_billboard (or y_billboard). Or rewrite MODELVIEW in vertex to face camera.

Custom shader for damage numbers. Not facing camera; rotates with object. Render mode missing.

The Fix

shader_type spatial;
render_mode blend_mix, depth_draw_alpha_prepass, particles_billboard;

void vertex() {
    // no manual matrix; render_mode handles it
}

// Or manual
void vertex() {
    MODELVIEW_MATRIX = VIEW_MATRIX * mat4(
        vec4(1, 0, 0, 0),
        vec4(0, 1, 0, 0),
        vec4(0, 0, 1, 0),
        MODEL_MATRIX[3]);
}

render_mode is declarative and faster. Manual gives you control over which axes lock.

Verifying

Sprite faces camera at any angle. Walk around object: stays facing.

“Render mode billboard. Or matrix math.”

Related Issues

For shader UV flip, see UV flip. For 2D light, see 2D light.

render_mode billboard. Faces.