Blending that doesn't suck

The blend modes in OpenGL weren’t very good. Real transparency has alpha-blended and additive components:

I can think of two ways to achieve this:

  • Render the background to a texture, then read from this and modify output as needed.
  • Render alpha-blended and additive components in two separate passes, using the hardware blend functions.

What do you suggest? Is there another method I am leaving out?

Have you used pre-multiplied alpha? Sounds like what you’re looking for:

And yes, you can do this with OpenGL.

All I had to do was read the second paragraph of the first article above and I thought “duh, that makes perfect sense”. Thanks!