简体   繁体   English

具有PBO的GPU的视频流在OpenGL中加载ImageQT

[英]Video stream by GPU with a PBO load an ImageQT in OpenGL

I plan to develop a tool for realtime video manipulation using C++, QT 4.7.4 and OpenGL and i'm on visual studio 2008. I check many web site but my code doesn't work since I try with PBO. 我计划开发一个使用C ++,QT 4.7.4和OpenGL进行实时视频处理的工具,并且我使用的是Visual Studio2008。我检查了许多网站,但由于尝试使用PBO,我的代码无法正常工作。 At the moment I imagine a following sequence of steps: 目前,我想象下面的步骤序列:

  1. load image file into QTimage 将图像文件加载到QTimage
  2. copy data into PBO with glmapBuffer 使用glmapBuffer将数据复制到PBO中
  3. transfert into a texture with glTextSubImage2D 使用glTextSubImage2D转换为纹理

Is correct ? 是正确的 ?

And after succes with several image then I'll begin with video. 在成功获得多个图像之后,我将以视频开始。

To see if I din't miss somthing a explaine my code: INIT I use glut so I initialised with : 看看我是否不想错过我的代码解释者:INIT我使用了glut,所以我使用了:

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

glEnable(GL_TEXTURE_2D);

In my MAIN: 在我的MAIN中:

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)

In a fonction loadImage I do the step 1: 在功能loadImage中,我执行步骤1:

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

And the step 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);
  }

And finally in the glutDisplayFunc(): 最后在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");

I get only an error on glTexSubImage2D() INVALID_OPERATION means generally format problem but I check many different format. 我在glTexSubImage2D()上仅收到一个错误,INVALID_OPERATION通常表示格式问题,但我检查了许多不同的格式。

I don't know if i completly lost or if I close to succes. 我不知道我是否完全输了,或者我是否成功。

ok I Call glTexImage2D only once to initialize the texture object in the loadImage fonction with : 好吧,我只调用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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM