0

我知道苹果提供了一个名为 GLCameraRipple 的示例,它使用 CVOpenGLESTextureCacheCreateTextureFromImage 来实现这一点。但是当我更改为 glTexImage2D 时,它什么也没有显示,我的代码有什么问题?

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);
}

非常感谢您的帮助!

4

1 回答 1

1

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

其次,您正在为每个上传的帧分配一个新纹理,这是一个非常糟糕的主意。如果您在完成后不删除该纹理,这尤其糟糕,因为您会以这种方式消耗资源。您应该为要上传的每个平面分配一次纹理,然后在上传每个视频帧时保留该纹理,仅在处理完视频后将其删除。

您要么需要修改上述内容以上传单独的 Y 和 UV 平面,要么删除/重写它们的颜色处理着色器。如果您走 BGRA 路线,您还需要确保相机现在为您提供 BGRA 帧而不是 YUV 帧。

于 2012-04-24T16:40:59.210 回答