But the fact that there’s blending going on at all means there has to be an alpha value of some sort right?
Yes, but having an alpha value doesn’t mean anything. The problem is that the math doesn’t work.
OK, let’s say you draw the background. The background is (0, 0, 0).
Now, you draw some translucent foreground. It has a color of (1, 1, 1), and is 50% opaque. So now the framebuffer has the color (0.5, 0.5, 0.5).
Then, you come along and want to draw something inbetween the translucent foreground and the background. This object is red: (1, 0, 0). It is opaque.
The correct answer, the answer you would reasonably expect, is (1, 0.5, 0.5).
The problem is that blending only has the current fragment color (1, 0, 0) and the destination framebuffer color (0.5, 0.5, 0.5) to work with. There is no blending operation that can take these two colors and produce the right answer. Even having the destination alpha be 0.5 and the source alpha be 1.0 doesn’t help.
Now, imagine that you have multiple transparent surfaces. Say, 3 layers, all composited together. What happens if you try to render a surface between them? Well, you can’t. You cannot isolate the original transparent surface colors; they have all been composited into a single color value. Without being able to do that, you simply cannot put something between them.
The solution is to render them in order. Render all of the opaque objects first, then render each of the translucent ones in order from back to front.
Would this not work?
No, it wouldn’t.
The color in the framebuffer is a composite color, based on what may have been multiple blending operations.