После некоторых проблем мне удалось правильно отобразить текстуру внутри объекта кадрового буфера в приложении Qt 4.8: я могу открыть контекст OpenGL с помощью QGLWidget, отобразить в FBO и использовать его в качестве текстуры.
Теперь мне нужно отобразить текстуру, отображаемую в QPixmap, и показать ее в каком-то другом виджете в графическом интерфейсе. Но.. ничего не показано.
Это некоторые фрагменты кода:
// 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
Я вижу, что виджет открыт, но... внутри него ничего нет. Если я раскомментирую тестовую строку.. Я вижу строку чувака, поэтому я знаю, что есть qlabel, но.. нет изображения из QPixmap.
Я знаю, что исходные данные представляют собой «unsigned char», и я использую «char» и пробовал с некоторыми другими параметрами цвета («GL_RGBA», «GL_RGB» и т. д.), но я не думаю, что это главное. .. дело в том, что я ничего не вижу..
Любой совет? Если мне нужно опубликовать больше кода, я сделаю это!
Редактировать:
Я не опубликовал весь код, но хочу прояснить, что текстура правильно отображается как текстура внутри куба. Я просто не могу вставить его обратно в процессор из gpu
Редактировать 2:
Благодаря ответу 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();
glCheckFramebufferStatus
-- любая ошибкаGL_FRAMEBUFFER_COMPLETE
указывает на то, что ваш FBO непригоден для использования. - person peppe   schedule 27.06.2013glCheckFramebufferStatus
. Факт, который я хотел бы уточнить, заключается в том, что визуализированная текстура (как текстура куба) правильно визуализируется. - person nkint   schedule 27.06.2013