我正在使用一个 API,它只给我纹理对象的整数 id,我需要将该纹理的数据传递给 AVAssetWriter 来创建视频。
我知道如何从像素缓冲区(CVPixelBufferRef)创建 CVOpenGLESTexture 对象,但在我的情况下,我必须以某种方式复制只有 id 可用的纹理的数据。
换句话说,我需要将 opengl 纹理复制到基于像素缓冲区的纹理对象中。可能吗?如果是,那怎么办?
在我的示例代码中,我有类似的内容:
void encodeFrame(Gluint textureOb)
{
CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferAdaptor pixelBufferPool], &pixelBuffer[0]);
CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault, coreVideoTextureCache, pixelBuffer[0],
NULL, // texture attributes
GL_TEXTURE_2D,
GL_RGBA, // opengl format
(int)FRAME_WIDTH,
(int)FRAME_HEIGHT,
GL_BGRA, // native iOS format
GL_UNSIGNED_BYTE,
0,
&renderTexture[0]);
CVPixelBufferLockBaseAddress(pixelBuffer[pixelBuffernum], 0);
//Creation of textureOb is not under my control.
//All I have is the id of texture.
//Here I need the data of textureOb somehow be appended as a video frame.
//Either by copying the data to pixelBuffer or somehow pass the textureOb to the Adaptor.
[assetWriterPixelBufferAdaptor appendPixelBuffer:pixelBuffer[0] withPresentationTime:presentationTime];
}
感谢您的提示和答案。
PSglGetTexImage
在 iOS 上不可用。
更新:
@博士。Larson,我无法为 API 设置纹理 ID。实际上我不能指定第 3 方 API 使用我自己创建的纹理对象。
看完答案后,我明白我需要:
1- 将像素缓冲区关联的纹理对象作为颜色附件附加到 texFBO。对于每一帧:
2-绑定从API获取的纹理
3-绑定texFBO并调用drawElements
我在这段代码中做错了什么?
PS 我对着色器还不熟悉,所以我现在很难使用它们。
更新 2: 在 Brad Larson 的回答的帮助下,使用正确的着色器解决了这个问题。我必须使用着色器,这是 Opengl ES 2.0 的基本要求