当我将操作系统从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
答案 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
。我还没有尝试过。