Well, the reason is obvious. With glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)we actually ignore the target alpha channel and consider it always to be 1. This is normal when we treat the frame buffer as opaque.
But what if we need the right alpha value? glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)and make the original pre-multiplex (pre-multiplied texture / vertex color, or multiply the alpha component by alpha components before setting it to gl_FragColor).
glBlendFunc , - , one_minus_src_alpha dst_alpha. . , , , . (: 0.5, 0.5, 0.5, 0.5 1.0, 1.0, 1.0, 0.5) glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA), - . , ,