在Linux中使用QGLFrameBufferObject渲染错误的颜色

时间:2012-10-30 08:27:30

标签: linux qt opengl alpha fbo

当我将操作系统从win7更改为Ubuntu 12.04 LTS时,我遇到了QGLFrameBufferObject的一些问题。在新的ubuntu系统中重新编译代码后,颜色出错了。所以我做了一个最小的测试。我只是用颜色(1.0,0.0,0.0,0.8)清除颜色缓冲区,就是这样。

当我直接渲染到屏幕时,我得到了正确的结果,所有像素都是(1.0,0.0,0.0,0.8)。

然而,离线渲染(使用QGLFrameBufferObject)的结果是错误的,如offline.png所示。该颜色为(0.3,0.0,0.0,0.8)。

当alpha&gt; 0.0和<1.0时会发生此问题。对于0.0和1.0,它可以正常工作。

我用win7操作系统在另一台计算机(计算机A)上编译了这个测试代码,一切正常。还试用了一台带有ubuntu操作系统的计算机(计算机B),一切正常。

我正在使用NVidia GeForce GTX 570 GPU,并尝试使用最新的稳定驱动程序(304.60)和旧版本(290.10,用于计算机B)用于linux-64bit,但没有任何变化。

任何人都知道为什么?以下是代码。

mywidget::mywidget(QWidget * parent) :
    QGLWidget(parent)
{
}

void mywidget::resizeGL(int width, int height )
{
    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 1.0, 0.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void mywidget::paintGL()
{
    glClearColor(1.0, 0.0, 0.0, 0.8);

    // DRAW ON THE SCREEN
    {
        glClear(GL_COLOR_BUFFER_BIT);
    }

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

    // DRAW ON THE FBO USING THE SAME CODE AND THE SAME CONTEXT
    {
        glClearColor(1.0, 0.0, 0.0, 0.8);
        glClear(GL_COLOR_BUFFER_BIT);
    }

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

我注意到有两个类似的帖子,但没有答案或详细答案: Wrong alpha blending when rendering on a QGLFramebufferObject; Alpha compositing wrong when rendering to QGLFrameBufferObject vs screen

2 个答案:

答案 0 :(得分:0)

您链接的问题提示:您的代码中没有任何地方可以启用混合。 尝试添加

 glEnable(GL_BLEND​​);

在进行任何渲染之前。

答案 1 :(得分:0)

正如@Nicol Bolas所指出的那样,问题出现在fbo.toImage().save("offline.png");函数的toImage()中。返回的图像以'QImage :: Format_ARGB32_Premultiplied'格式创建,但像素颜色数据设置为QImage::Format_ARGB32格式。也许这是Qt 4.8中的一个错误。我认为通过在QImage::Format_ARGB32_Premultiplied函数中将QImage::Format_ARGB32更改为QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha)可以解决问题。此代码位于qgl.cpp。我还没有尝试过。