Неправильное альфа-смешение при рендеринге в QGLFramebufferObject

Я пишу рендерер векторной графики на основе OpenGL для своего приложения. Он должен визуализироваться в объект кадрового буфера, а не напрямую на экран. Поскольку я пишу приложение в Qt, я использую QGLFramebufferObject, который является классом-оберткой для объекта кадрового буфера OpenGL.

Я создал минимальный пример, который показывает неправильный результат, который я также получаю при рендеринге более сложных вещей (например, используя фрагментный шейдер, который устанавливает цвета с не-одним альфа-значением). Я просто рисую красный круг и полупрозрачный зеленый на черном очищенном экране, а затем то же самое на 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");
}

Результат выглядит следующим образом на экране (масштаб 400%):

enter image description here

Визуализация в QGLFramebufferObject выглядит следующим образом (также масштабируется на 400%):

enter image description here

Обратите внимание, что это изображение не является полностью непрозрачным, поэтому здесь оно является тем же изображением с добавленной за ним шахматной доской:

enter image description here

Даже область, в которой эти два круга перекрывают друг друга, не является полностью непрозрачной. И сглаживание выглядит довольно некрасиво.

How does this happen? And how can I fix this?

Я уже попробовал:

Different blend functions. Explicitly disabling the depth buffer, stencil buffer and sampling on the QGLFramebufferObject. I'm not sure if the QGLFramebufferObject default format adds something I don't want.

Ответы на вопрос(1)

Ваш ответ на вопрос