У меня есть приложение, в котором я хотел бы использовать FBO для отображения изображения фильма QuickTime. Я совершенно не знаком с FBOs и получил немного знаний по OpenGL. У меня проблемы с пониманием парадигмы FBO со связующими текстурами и материалами, и я надеюсь, что вы, ребята, могли бы помочь.CVPixelBuffer to FBO
Чтобы получить текущее изображение фильма, я использую
QTVisualContextCopyImageForTime(theContext, NULL, NULL, ¤tFrameTex);
где 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);
Я просто получаю черный изображение, и я не знаю, что я делаю неправильно. При необходимости может быть предоставлена дополнительная информация. Заранее спасибо!
Hey Maf, спасибо за ваш ответ. Где я что-то переписываю? Что мне нужно сделать, чтобы текстура была нарисована правильно? Я уже читал эту статью, но мне что-то не хватает. Большое спасибо! – guitarflow
Вам не нужно FBO для рендеринга вашей текстуры. Выведите его прямо на экран. – Maf
CVOpenGLTextureGetName (currentFrameTex) возвращает текстуру, которая уже содержит ваше изображение. Вызов glTexImage2D с этой привязкой текстуры перераспределяет эту текстуру с новым контентом и новым измерением, поэтому вы теряете свой кадр фильма. Когда вы прикрепляете эту новую текстуру к FBO (glFramebufferTexture2D), вы эффективно рисуете эту текстуру (через FBO). Если вам действительно нужно FBO, то либо создайте новую текстуру (glGenTextures), либо прикрепите ее к FBO или используйте буфер визуализации (glRenderbufferStorage). – Maf