Błędne mieszanie alfa podczas renderowania na obiekcie QGLFramebufferObject

Dla mojej aplikacji piszę renderer grafiki wektorowej oparty na OpenGL. Musi być renderowany na obiekt bufora ramki, a nie bezpośrednio na ekran. Ponieważ piszę aplikację w Qt, używam obiektu QGLFramebufferObject, który jest klasą opakowania dla obiektu bufora ramki OpenGL.

Stworzyłem minimalny przykład, który pokazuje zły wynik, który otrzymuję także podczas renderowania bardziej złożonych rzeczy (na przykład przy użyciu fragmentatora cieniującego, który ustawia kolory o wartości innej niż alfa). Po prostu renderuję czerwone kółko i półprzezroczyste zielone na czarnym ekranie, a potem to samo w FBO:

void MainWidget::initializeGL()
{
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0, 0, 0, 0);
}

void MainWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);
}

void MainWidget::paintGL()
{
    // DRAW ON THE SCREEN
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glPointSize(100);
        glEnable(GL_POINT_SMOOTH);
        glBegin(GL_POINTS);
        glColor4f(1, 0, 0, 1);
        glVertex2f(-.2, 0);
        glColor4f(0, 1, 0, .5);
        glVertex2f( .2, 0);
        glEnd();
    }

    QGLFramebufferObject fbo(width(), height());
    fbo.bind();

    // DRAW ON THE FBO USING THE SAME CODE AND THE SAME CONTEXT
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glPointSize(100);
        glEnable(GL_POINT_SMOOTH);
        glBegin(GL_POINTS);
        glColor4f(1, 0, 0, 1);
        glVertex2f(-.2, 0);
        glColor4f(0, 1, 0, .5);
        glVertex2f( .2, 0);
        glEnd();
    }

    fbo.release();
    fbo.toImage().save("debug.png");
}

Wynik wygląda tak na ekranie (skalowany 400%):

Renderowanie do obiektu QGLFramebufferObject wygląda następująco (również skalowane 400%):

Zauważ, że ten obraz nie jest w pełni nieprzezroczysty, więc tutaj jest ten sam obraz z dodaną szachownicą:

Nawet obszar, w którym dwa koła się nakładają, nie jest całkowicie nieprzezroczysty. A antyaliasing wygląda dość brzydko.

Jak to się stało? I jak mogę to naprawić?

Próbowałem już:

Różne funkcje mieszania.Jawne wyłączenie bufora głębokości, bufora wzornika i próbkowania w obiekcie QGLFramebufferObject. Nie jestem pewien, czy domyślny format QGLFramebufferObject dodaje coś, czego nie chcę.

questionAnswers(1)

yourAnswerToTheQuestion