1

OS を 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 OS を搭載した別のコンピューター (コンピューター A) でこのテスト コードをコンパイルしました。すべて正常に動作します。ubuntu OSを搭載したもう1台のコンピューター(コンピューター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");
}

2 つの同様の投稿があることに気付きましたが、回答も詳細な回答もありません: QGLFramebufferObject でレンダリングするときの間違ったアルファブレンディング QGLFrameBufferObject vs スクリーンにレンダリングするときのアルファ合成が間違っている

4

2 に答える 2

0

リンクした質問はヒントを与えます:あなたのコードのどこにもブレンドを有効にしません。追加してみてください

 glEnable(GL_BLEND​​);

レンダリングを行う前に。

于 2012-10-30T09:45:58.617 に答える
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_ARGB32QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha)問題が解決すると思います。このコードは にありqgl.cppます。まだ試していません。

于 2012-10-31T10:41:27.950 に答える