Неправильное альфа-смешение при рендеринге в 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%):
Визуализация в QGLFramebufferObject выглядит следующим образом (также масштабируется на 400%):
Обратите внимание, что это изображение не является полностью непрозрачным, поэтому здесь оно является тем же изображением с добавленной за ним шахматной доской:
Даже область, в которой два круга перекрываются, нет полностью непрозрачный. И сглаживание выглядит довольно некрасиво.
Как это произошло? И как я могу это исправить?
Я уже попробовал:
Различные функции смешивания.Явное отключение буфера глубины, буфера трафарета и выборки в QGLFramebufferObject. Я'я не уверен, что формат по умолчанию QGLFramebufferObject добавляет что-то, что я не делаюне хочу