1

当我将操作系统从 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>0.0 且 <1.0 时会出现此问题。对于 0.0 和 1.0,它工作正常。

我已经在另一台装有win7操作系统的计算机(计算机A)上编译了这个测试代码,一切正常。还尝试在另一台带有 ubuntu OS 的计算机(计算机 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");
}

我注意到有两个类似的帖子,但没有答案或详细答案: 在 QGLFramebufferObject 上渲染时错误的 alpha blending渲染到 QGLFrameBufferObject 与屏幕时 Alpha 合成错误

4

2 回答 2

0

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

于 2012-10-31T10:41:27.950 回答
0

您链接的问题给出了一个提示:您的代码中没有任何地方启用混合。尝试添加

 glEnable(GL_BLEND​​);

在进行任何渲染之前。

于 2012-10-30T09:45:58.617 回答