いくつかの問題の後、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();