我尝试在ios上使用opengl es 2.0渲染相机捕获的帧,然后使用AVAssetWriter将帧写入视频文件。
所以我从CVPixelBufferRef
创建了AVAssetWriterInputPixelBufferAdaptor
并使用关注代码从CVOpenGLESTextureRef
创建了CVPixelBufferRef
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
mRenderTextureCache,
mOutputPixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
mOutputDimensions.width,
mOutputDimensions.height,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&mOutputTexture);
if (err != kCVReturnSuccess || !mOutputTexture)
{
NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage with output texture %d", err);
}
glBindTexture(CVOpenGLESTextureGetTarget(mOutputTexture), CVOpenGLESTextureGetName(mOutputTexture));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
然后我将这个纹理绑定到帧缓冲区的颜色附件。
但是当我渲染并捕获GPU帧时,我总是得到一个opengl错误,说我的帧缓冲区'颜色附件的内部格式不是纹理可过滤的。
那么代码有什么问题?我是否设置了纹理的内部格式错误?
奇怪的是结果视频是正确的。
而且,我注意到它对渲染缓冲区的渲染有点缓慢渲染,是否由此opengl错误引起?