CVOpenGLESTextureCacheCreateTextureFromImage vs glTexImage2D

时间:2012-12-12 21:12:50

标签: ios video opengl-es opengl-es-2.0 avfoundation

我有一个iOS应用,我正在阅读AVFoundation的视频,并将每个视频帧加载到OpenGL纹理中,并在GLKView的屏幕上显示。

我为每帧复制视频缓冲区没有问题:

CVPixelBufferRef buffer = [someAVPlayerItemVideoOutput copyPixelBufferForItemTime:itemTime itemTimeForDisplay:nil];

但是当我将视频加载到openGL中时,我会得到不同的结果,具体取决于我使用的方法。通过观看Apple的WWDC 2011 Session 414 OpenGL视频的进展,我的理解是新的CVOpenGLESTextureCacheCreateTextureFromImage函数应该比通过glTexImage2D读取像素缓冲区更快。但是,当使用具有大量计算的着色器程序时,无论使用哪种方法,我都会获得相同的帧速率。此外,CVOpenGLESTextureCacheCreateTextureFromImage实际上给了我一个奇怪的“块状”失真,而glTexImage2D却没有。失真似乎好像屏幕上的随机块不会使用最新帧更新。

以下是我用于使用CVOpenGLESTexture方法创建纹理的代码:

CVOpenGLESTextureRef videoFrameTexture = NULL;
CVPixelBufferLockBaseAddress(buffer, 0);    
CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, videoTextureCache, buffer, NULL, GL_TEXTURE_2D, GL_RGBA, CVPixelBufferGetWidth(buffer), CVPixelBufferGetHeight(buffer), GL_BGRA, GL_UNSIGNED_BYTE, 0, &videoTexture);
glBindTexture(GL_TEXTURE_2D, CVOpenGLESTextureGetName(videoFrameTexture));
CVBufferRelease(buffer);    
CFRelease(videoFrameTexture);

以下是我通过glTexImage2D加载的替代方式:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, CVPixelBufferGetBytesPerRow(buffer)/4, CVPixelBufferGetHeight(buffer), 0, GL_RGBA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(buffer));

使用CVOpenGLESTextureCacheCreateTextureFromImage()

,为什么会出现奇怪的失真和没有更好的帧速率?

0 个答案:

没有答案