So I got my demo running, there's still one issue that I'm not quite sure how to solve, if you look at them with your view direction near parallel to the +Y axis the billboards spin some, which isn't really correct. This is due to the view direction being too parallel to the up vector (+Y) we use to compute the horizontal vector of the quad.
One way to fix it is to detect this case where they get too parallel and switch the up axis you're using (eg. to +Z/+X) to find the horizontal vector but this causes a noticeable jump on the billboards when you change axes. I may ask around some places later or see what I can work out that behaves nicer. Although if you won't be viewing things from this angle then it's not really an issue
haha.
Anyways, here's the demo:
https://github.com/Twinklebear/vsbillboards. The README has a high level overview of what's going on and then you can start reading main and the vertex shader (in res/vertex.glsl) to get into the details of it.
Note that for the instance attributes (position & sprite id) I used two buffers out of lazyness but for best performance you should really be using a single buffer.
If anyone has any ideas about the +Y issue let me know!