2012-04-24 205 views
0

我知道苹果提供了一个名为GLCameraRipple的示例,它使用CVOpenGLESTextureCacheCreateTextureFromImage来实现此目的。但是当我更改为glTexImage2D时,它什么都不显示,我的代码出了什么问题?iphone OpenGLES视频纹理

if (format == kCVPixelFormatType_32BGRA) { 
CVPixelBufferRef pixelBuf = CMSampleBufferGetImageBuffer(sampleBuffer); 
CVPixelBufferLockBaseAddress(pixelBuf, 0); 
void *baseaddress = CVPixelBufferGetBaseAddress(pixelBuf); 

glGenTextures(1, &textureID); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textureID); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, baseaddress); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

CVPixelBufferUnlockBaseAddress(pixelBuf, 0); 
} 

非常感谢您的帮助!

回答

1

这里有几个问题。首先,GLCameraRipple的例子是为了拍摄YUV相机数据,而不是BGRA。您的上述代码仅上传一个BGRA数据纹理,而不是应用程序预期的单独Y和UV平面。它使用色彩空间转换着色器将这些平面合并为第一阶段,并且需要YUV数据才能工作。

其次,你为每个上传的帧分配一个新的纹理,这是一个非常糟糕的主意。如果您在完成时不删除该纹理,这是特别糟糕的,因为您会以这种方式咀嚼资源。您应该为每个要上传的平面分配一次纹理,然后在上传每个视频帧时保留该纹理,只有在处理完视频后才删除。

您需要重做上述内容以上传单独的Y和UV平面,或者删除/重写其颜色处理着色器。如果你走BGRA路线,你还需要确保摄像头现在给你BGRA帧而不是YUV帧。