经过一些麻烦我已经设法在Qt 4.8应用程序中正确渲染到帧缓冲对象内的纹理:我可以用QGLWidget打开一个OpenGL上下文,渲染到FBO,并将其用作纹理。 / p>
现在我需要显示在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
我看到Widget打开但是......里面什么都没有。如果我退出测试线..我看到“dudee”字符串,所以我知道有一个qlabel但是......没有来自QPixmap的图像。
我知道原始数据是'未签名的字符'而我正在使用'char'而我尝试了一些不同的颜色参数('GL_RGBA','GL_RGB'等)但我不认为这是关键点......重点是我什么都看不到......
有什么建议吗?如果我必须发布更多代码,我会这样做!
我还没有发布所有代码,但我想清楚的是纹理在多维数据集中正确呈现为纹理。我只是无法将它放回来自gpu
的cpu中感谢peppe回答我发现了问题:我需要一个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();
答案 0 :(得分:2)
鉴于这不是你的所有代码和 - 如你所说 - 纹理被正确填充,那么这里有一点错误:
glReadPixels(0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, pixels);
QPixmap qp = QPixmap(pixels);
QPixmap(const char *)
ctor想要一个XPM图像,而不是原始像素。您需要使用其中一个QImage ctors来创建有效的QImage。 (您也可以将所有权传递给QImage,解决您当前泄漏pixels
的事实......)
一旦你这样做,你就会发现
图像垂直翻转,因为OpenGL左下角有原点,向上/向右增长,而Qt在左上角呈现原点,向上/向右增长;
可能会交换频道 - 即OpenGL返回的内容错误。我不记得在这种情况下,如果使用glPixelStorei(GL_PACK_SWAP_BYTES)
或GL_UNSIGNED_INT_8_8_8_8
类型可能会有所帮助,最终您需要求助于CPU端循环来修复像素数据:)