我正在使用一个只提供纹理对象整数id的API,并且我需要将该纹理的数据传递给AVAssetWriter以创建视频。我知道如何从像素缓冲区(CVPixelBufferRef)创建CVOpenGLESTexture对象,但在我的情况下,我必须以某种方式复制仅具有ID的纹理的数据。换句话说,我需要将一个opengl纹理复制到基于像素缓冲区的纹理对象中。这是否可能?如果是,则如何实现?在我的示例代码中,我有类似以下的内容:
感谢您的提示和回答。
P.S. 在iOS上无法使用glGetTexImage。
更新:
@Larson博士,我无法为API设置纹理ID。 事实上,我不能要求第三方API使用我自己创建的纹理对象。
经过查看答案,我了解到需要做以下几点:
1- 将像素缓冲器关联的纹理对象作为颜色附件附加到texFBO。 对于每个帧:
2- 绑定从API获取的纹理
3- 绑定texFBO并调用drawElements
这段代码有什么问题吗?
P.S. 我还不熟悉着色器,所以现在很难利用它们。
更新2:
在Brad Larson的答案和使用正确的着色器的帮助下,问题得到解决。 我必须使用OpenGL ES 2.0的基本要求——着色器。
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];
}
感谢您的提示和回答。
P.S. 在iOS上无法使用glGetTexImage。
更新:
@Larson博士,我无法为API设置纹理ID。 事实上,我不能要求第三方API使用我自己创建的纹理对象。
经过查看答案,我了解到需要做以下几点:
1- 将像素缓冲器关联的纹理对象作为颜色附件附加到texFBO。 对于每个帧:
2- 绑定从API获取的纹理
3- 绑定texFBO并调用drawElements
这段代码有什么问题吗?
P.S. 我还不熟悉着色器,所以现在很难利用它们。
更新2:
在Brad Larson的答案和使用正确的着色器的帮助下,问题得到解决。 我必须使用OpenGL ES 2.0的基本要求——着色器。