[英]Video stream by GPU with a PBO load an ImageQT in OpenGL
我計划開發一個使用C ++,QT 4.7.4和OpenGL進行實時視頻處理的工具,並且我使用的是Visual Studio2008。我檢查了許多網站,但由於嘗試使用PBO,我的代碼無法正常工作。 目前,我想象下面的步驟序列:
是正確的 ?
在成功獲得多個圖像之后,我將以視頻開始。
看看我是否不想錯過我的代碼解釋者:INIT我使用了glut,所以我使用了:
glutInit(&iArgc, cppArgv);
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA);
glutInitWindowSize(1000, 1000);
glutInitWindowPosition(500, 10);
glutCreateWindow("Texture");
glEnable(GL_TEXTURE_2D);
在我的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)
在功能loadImage中,我執行步驟1:
QImage image;
image.load(name);
imageGL = QGLWidget::convertToGLFormat(image);
imageGL = (image.convertToFormat(QImage::Format_RGB888));//format is important
第二步:
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通常表示格式問題,但我檢查了許多不同的格式。
我不知道我是否完全輸了,或者我是否成功。
好吧,我只調用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.