2012-10-30 22 views
1

我遇到了QGLFrameBufferObject的一些問題,當我將操作系統從win7更改爲Ubuntu 12.04 LTS。在新的ubuntu系統中重新編譯代碼後,顏色出錯。所以我做了一個最小的測試。我只是用顏色(1.0,0.0,0.0,0.8)清除顏色緩衝區,就是這樣。錯誤的顏色與QGLFrameBufferObject渲染在Linux中

當我直接渲染到屏幕上時,我得到了正確的結果,所有像素都是(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,它工作正常。

我已經編譯了這個測試代碼在另一臺電腦(電腦A)與Win7操作系統,一切工作正常。還嘗試在一臺計算機(電腦B)與Ubuntu操作系統,一切工作正常。我使用的是NVidia GeForce GTX 570 GPU,並且嘗試了linux-64bit的最新穩定驅動程序(304.60)和舊版本(290.10,用於計算機B),但沒有任何更改。

任何人都知道爲什麼?以下是代碼。

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

「* fbo.toImage()。save(」offline.png「); *」我會更關心的是* this *會出錯。如果將FBO粘貼到屏幕上,FBO會是什麼樣子? –

+0

是的!這是toImage函數的問題。當我直接綁定fbo的紋理時,我可以從屏幕上看到它工作正常。謝謝。然後我必須檢查toImage中有什麼問題。 – blueteaxk

回答

0

您鏈接的問題給出了一個提示:在您的代碼中無處可啓用混合。 嘗試添加

glEnable(GL_BLEND​​); 

在做任何呈現之前。

+0

感謝您的回覆,我試着在glClearColor之前添加這個句子,但沒有任何變化。 – blueteaxk

0

由於@Nicol Bolas指出,問題出在fbo.toImage().save("offline.png");,在toImage()函數中。返回的圖像是以'QImage :: Format_ARGB32_Premultiplied'格式創建的,但像素顏色數據的設置方式與其格式爲QImage::Format_ARGB32格式相同。也許這是Qt 4.8中的一個錯誤。我認爲通過改變QImage::Format_ARGB32_PremultipliedQImage::Format_ARGB32QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha)函數就可以解決問題。此代碼在qgl.cpp。但我還沒有嘗試過。