Я планирую разработать инструмент для манипулирования видео в реальном времени с использованием C ++, QT 4.7.4 и OpenGL, и я на Visual Studio 2008. Я проверяю многие веб-сайты, но мой код не работает, так как я пытаюсь с PBO. На данный момент я представляю следующую последовательность шагов:
- загрузить файл изображения в QTimage
- копирование данных в PBO с помощью glmapBuffer
- перевод в текстуру с помощью 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
значит вообще проблема с форматированием но я проверяю много разных форматов.
Я не знаю, потерял ли я полностью или близок к успеху.