Видеопоток с помощью графического процессора с PBO загружает ImageQT в OpenGL - PullRequest
0 голосов
/ 11 июля 2019

Я планирую разработать инструмент для манипулирования видео в реальном времени с использованием C ++, QT 4.7.4 и OpenGL, и я на Visual Studio 2008. Я проверяю многие веб-сайты, но мой код не работает, так как я пытаюсь с PBO. На данный момент я представляю следующую последовательность шагов:

  1. загрузить файл изображения в QTimage
  2. копирование данных в PBO с помощью glmapBuffer
  3. перевод в текстуру с помощью glTextSubImage2D

Правильно?

А после нескольких изображений я начну с видео.

Чтобы узнать, не пропустил ли я что-нибудь, объясните мой код: В ЭТОМ Я использую перенасыщение, поэтому я инициализировал с:

glutInit(&iArgc, cppArgv); 
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE  | GLUT_ALPHA);
glutInitWindowSize(1000, 1000);
glutInitWindowPosition(500, 10);
glutCreateWindow("Texture"); 

glEnable(GL_TEXTURE_2D);

В моем ГЛАВНОМ:

GLuint pboIds[2];
glGenBuffers(N_MAX_BUFFERS, pboIds);
//for two buffers
glBindBuffer(GL_PIXEL_PACK_BUFFER, pboIds[iBuffer]);
glBufferData(GL_PIXEL_PACK_BUFFER, DATA_SIZE, NULL, GL_STREAM_DRAW);

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
glReadBuffer(GL_FRONT);

glGenTextures(1,&texture)

В функции loadImage я делаю шаг 1:

QImage image;
image.load(name);
imageGL = QGLWidget::convertToGLFormat(image);
imageGL = (image.convertToFormat(QImage::Format_RGB888));//format is important

И шаг 2:

for (int iBuffer = 0; iBuffer < N_MAX_BUFFERS; ++iBuffer)
  {
    glBindBuffer(GL_PIXEL_PACK_BUFFER_EXT, pboIds[iBuffer]);
    glBufferData(GL_PIXEL_PACK_BUFFER_EXT, DATA_SIZE, NULL, GL_STREAM_DRAW);

    void * pPixelsPBO = glMapBuffer(GL_PIXEL_PACK_BUFFER_EXT, GL_WRITE_ONLY);
    // copy original image into the buffer (Step 2)
    if(pPixelsPBO)
    {
      pPixelsPBO = new unsigned char[imageGL.width() * imageGL.height() * 3];
      memcpy(pPixelsPBO, imageGL.bits(), DATA_SIZE);
    }
    glUnmapBuffer(GL_PIXEL_PACK_BUFFER_EXT
    glBindBuffer(GL_PIXEL_PACK_BUFFER_EXT, 0);
  }

И, наконец, в glutDisplayFunc ():

//step 3
glBindTexture(GL_TEXTURE_2D, texture);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboIds[Index]);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, imageGL.width(), imageGL.height(), GL_RGB, GL_UNSIGNED_BYTE, 0);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
///

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glPushMatrix();
glBindTexture(GL_TEXTURE_2D, texture);
glColor4f(1, 1, 1, 1);

glBegin(GL_QUADS);

glTexCoord2i(0,0); glVertex2i(0,imageGL.height());
glTexCoord2i(0,1); glVertex2i(0,0);
glTexCoord2i(1,1); glVertex2i(imageGL.width(),0);
glTexCoord2i(1,0); glVertex2i(imageGL.width(),imageGL.height());
glEnd();

glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glutSwapBuffers();

//to load the next data from image 
// I do the step 1 et 2 at the end
LoadImg("./Code.jpg");

Я получаю только ошибку в glTexSubImage2D () INVALID_OPERATION значит вообще проблема с форматированием но я проверяю много разных форматов.

Я не знаю, потерял ли я полностью или близок к успеху.

1 Ответ

0 голосов
/ 11 июля 2019

ok Я вызываю glTexImage2D только один раз, чтобы инициализировать объект текстуры в функции loadImage с помощью:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);//GL_NEAREST  GL_LINEAR
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8,imageGL.width(), imageGL.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)imageGL.bits()); 
glBindTexture(GL_TEXTURE_2D, 0);
...