glBlendFunc(GL_SRC_ALPHA, GL_ONE)
примерно переводит в следующее уравнение (технически, зажим происходит в другом месте)
New_Framebuffer_Value :=
New_Red := min(1, Incoming_Red * Incoming_Alpha + Previous_Framebuffer_Red )
New_Green := min(1, Incoming_Green * Incoming_Alpha + Previous_Framebuffer_Green )
New_Blue := min(1, Incoming_Blue * Incoming_Alpha + Previous_Framebuffer_Blue )
Однако, если вы установили значение while, значение Previous_Framebuffer_{Red,Green,Blue}
уже равно 1,0, и поэтому все последующиебудет зажат.
Таким образом, вам нужно модулировать не только входящие фрагменты, но и предыдущие:
New_Framebuffer_Value :=
New_Red := min(1, Incoming_Red * Incoming_Alpha + Previous_Framebuffer_Red * ( 1 - Incoming_Alpha ) )
New_Green := min(1, Incoming_Green * Incoming_Alpha + Previous_Framebuffer_Green * ( 1 - Incoming_Alpha ) )
New_Blue := min(1, Incoming_Blue * Incoming_Alpha + Previous_Framebuffer_Blue * ( 1 - Incoming_Alpha ) )
, что выполняется glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)