1

いくつかの問題の後、Qt 4.8 アプリケーションのフレーム バッファ オブジェクト内のテクスチャに正しくレンダリングすることができました。QGLWidget で OpenGL コンテキストを開き、FBO にレンダリングして、これをテクスチャとして使用できます。

ここで、QPixmap でレンダリングされたテクスチャを表示し、GUI の他のウィジェットで表示する必要があります。しかし..何も表示されません。

これらはいくつかのコードです:

// generate texture, FBO, RBO in the initializeGL
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glGenRenderbuffers(1, &rboId);
glBindRenderbuffer(GL_RENDERBUFFER, rboId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

// now in paintGL
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
// .... render into texture code ....
if(showTextureInWidget==false) {
    showTextureInWidget = true;
    char *pixels;
    pixels = new  char[TEXTURE_WIDTH * TEXTURE_HEIGHT * 4];
    glReadPixels(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, pixels);
    QPixmap qp = QPixmap(pixels);
    QLabel *l = new QLabel();
    // /* TEST */ l->setText(QString::fromStdString("dudee"));
    l->setPixmap(qp);
    QWidget *d = new QWidget;
    l->setParent(d);
    d->show();
}
glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind
// now draw the scene with the rendered texture

ウィジェットが開いているのがわかりますが、中には何もありません。テスト行のコメントを外すと..「dudee」文字列が表示されるので、qlabelがあることがわかりますが.. QPixmapからの画像はありません。

元のデータが「unsigned char」であることは知っていますが、「char」を使用していて、いくつかの異なる色パラメータ (「GL_RGBA」、「GL_RGB」など) を試しましたが、これがポイントではないと思います。 . ポイントは、何も見えないということです..

何かアドバイス?さらにコードを投稿する必要がある場合は、投稿します。

編集:

すべてのコードを投稿したわけではありませんが、明確にしたいのは、テクスチャがキューブ内のテクスチャとして正しくレンダリングされていることです。GPUからCPUに戻すことができません

編集2:

ペッペの回答のおかげで、問題が見つかりました。コンストラクターとして生のピクセルデータを受け入れるQtオブジェクトが必要でした。完全なスニペットは次のとおりです。

    uchar *pixels;
    pixels = new uchar[TEXTURE_WIDTH * TEXTURE_HEIGHT * 4];
    for(int i=0; i < (TEXTURE_WIDTH * TEXTURE_HEIGHT * 4) ; i++ ) {
        pixels[i] = 0;
    }

    glBindFramebuffer(GL_FRAMEBUFFER, fboId);
    glReadPixels( 0,0,  TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    qi = QImage(pixels, TEXTURE_WIDTH, TEXTURE_HEIGHT, QImage::Format_ARGB32);
    qi = qi.rgbSwapped();

    QLabel *l = new QLabel();
    l->setPixmap(QPixmap::fromImage(qi));
    QWidget *d = new QWidget;
    l->setParent(d);
    d->show();
4

1 に答える 1

2

それがすべてのコードではなく、あなたが言うように、テクスチャが正しく塗りつぶされていることを考えると、ここで小さな間違いが起こっています:

glReadPixels(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, pixels);
QPixmap qp = QPixmap(pixels);

ctorQPixmap(const char *)は生のピクセルではなく、XPM 画像を必要とします。有効な QImage を作成するには、QImage ctors のいずれかを使用する必要があります。(所有権を QImage に渡すこともできます。これにより、現在リークしているという事実を解決できますpixels...)

それをやったらわかるよ

  1. OpenGL は左下隅に原点があり、上/右方向に成長するのに対し、Qt は左上に原点があり、下/右方向に成長するため、画像は垂直に反転されます。

  2. チャネルがスワップされている可能性があります。つまり、OpenGL が間違ったエンディアンでデータを返しています。この場合、glPixelStorei(GL_PACK_SWAP_BYTES)orGL_UNSIGNED_INT_8_8_8_8をタイプとして使用すると役立つかどうかは覚えていません。最終的には、ピクセルデータを修正するために CPU 側のループに頼る必要があります :)

于 2013-06-27T16:27:09.523 に答える