2013-02-16 12 views
0

У меня есть приложение, в котором я хотел бы использовать FBO для отображения изображения фильма QuickTime. Я совершенно не знаком с FBOs и получил немного знаний по OpenGL. У меня проблемы с пониманием парадигмы FBO со связующими текстурами и материалами, и я надеюсь, что вы, ребята, могли бы помочь.CVPixelBuffer to FBO

Чтобы получить текущее изображение фильма, я использую

QTVisualContextCopyImageForTime(theContext, NULL, NULL, &currentFrameTex); где currentFrameTex является CVImageBufferRef.

Для настройки FBO, все, что я делаю:

glGenFramebuffersEXT(1, &idFrameBuf); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, idFrameBuf); 

Я использую следующий код для отрисовки изображения:

// get the texture target (for example, GL_TEXTURE_2D) of the texture 
GLint target = CVOpenGLTextureGetTarget(currentFrameTex); 
// get the texture target name of the texture 
GLint texID = CVOpenGLTextureGetName(currentFrameTex); 

// get the texture coordinates for the part of the image that should be displayed 
CVOpenGLTextureGetCleanTexCoords(currentFrameTex, 
           bottomLeft, bottomRight, 
           topRight, topLeft); 
glBindTexture(target, texID); 
glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

glTexImage2D(target, 0, GL_RGBA8, 256, 256, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, target, texID, 0); 

Я просто получаю черный изображение, и я не знаю, что я делаю неправильно. При необходимости может быть предоставлена ​​дополнительная информация. Заранее спасибо!

ответ

1

См. http://www.opengl.org/wiki/Framebuffer_Object. FBO позволяет визуализировать графику в буфер вне экрана, а затем обрабатывать ее. Ваш код перезаписывает текстуру, предоставленную currentFrameTex, что не имеет большого смысла. Как только вы вызываете glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, idFrameBuf) с ненулевым idFrameBuf, тогда вся графика рисуется на этом FBO и ничего не отображается на экране.

+0

Hey Maf, спасибо за ваш ответ. Где я что-то переписываю? Что мне нужно сделать, чтобы текстура была нарисована правильно? Я уже читал эту статью, но мне что-то не хватает. Большое спасибо! – guitarflow

+0

Вам не нужно FBO для рендеринга вашей текстуры. Выведите его прямо на экран. – Maf

+1

CVOpenGLTextureGetName (currentFrameTex) возвращает текстуру, которая уже содержит ваше изображение. Вызов glTexImage2D с этой привязкой текстуры перераспределяет эту текстуру с новым контентом и новым измерением, поэтому вы теряете свой кадр фильма. Когда вы прикрепляете эту новую текстуру к FBO (glFramebufferTexture2D), вы эффективно рисуете эту текстуру (через FBO). Если вам действительно нужно FBO, то либо создайте новую текстуру (glGenTextures), либо прикрепите ее к FBO или используйте буфер визуализации (glRenderbufferStorage). – Maf