2012-10-30 4 views
1

OS를 win7에서 Ubuntu 12.04 LTS로 변경할 때 QGLFrameBufferObject에 약간의 문제가 발생했습니다. 새로운 우분투 시스템에서 코드를 다시 컴파일하면 색상이 잘못됩니다. 그래서 나는 최소한의 테스트를했다. 색상 버퍼를 지우고 (1.0, 0.0, 0.0, 0.8), 그게 전부입니다.리눅스에서 QGLFrameBufferObject를 렌더링 할 때 색상이 잘못되었습니다.

화면에 직접 렌더링 할 때 모든 픽셀이 (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 OS가 설치된 다른 컴퓨터 (컴퓨터 A)에서이 테스트 코드를 컴파일했지만 모든 것이 정상적으로 작동합니다. 또한 우분투 OS로 한대 더 컴퓨터 (컴퓨터 B)에서 시험 해봤는데 모든 것이 잘 작동합니다.

NVidia GeForce GTX 570 GPU를 사용하고 Linux-64bit 용 최신 안정 드라이버 (304.60)와 이전 버전 (컴퓨터 B 용 290.10)을 사용해 보았지만 아무런 변화가 없습니다.

누구나 아는 이유는 무엇입니까? 아래는 코드입니다.

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_ARGB32으로 변경하면 QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha) 기능이 문제를 해결할 것입니다. 이 코드는 qgl.cpp에 있습니다. 아직도 나는 그것을 시도하지 않았다.

관련 문제