gpt4 book ai didi

iphone - 将纹理复制到 PixelBuffer (CVPixelBufferRef)

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:09:59 24 4
gpt4 key购买 nike

我使用的 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];

}

感谢提示和答案。

附言glGetTexImage 在 iOS 上不可用。

更新:

@博士。 Larson,我无法为 API 设置纹理 ID。实际上我不能指示第 3 方 API 使用我自己创建的纹理对象。

看完答案后,我明白我需要:

1- 将像素缓冲区关联的纹理对象作为颜色附件附加到 texFBO。对于每一帧:

2-绑定(bind)从API获取的纹理

3- 绑定(bind) texFBO 并调用 drawElements

我在这段代码中做错了什么?

附言我还不熟悉着色器,所以我现在很难使用它们。

更新 2:在 Brad Larson 的回答的帮助下,使用正确的着色器解决了这个问题。我不得不使用着色器,这是 Opengl ES 2.0 的基本要求

最佳答案

要从 iOS 上的 OpenGL ES 读回数据,基本上有两条路线:使用 glReadPixels() ,或使用纹理缓存(仅限 iOS 5.0+)。

您只有一个纹理 ID 而无法访问其他任何东西这一事实有点奇怪,并且限制了您在此处的选择。如果您无法设置要在此第三方 API 中使用的纹理,您将需要将该纹理重新渲染到屏幕外帧缓冲区以使用 glReadPixels() 为其提取像素。或纹理缓存。为此,您需要使用与纹理大小相同的 FBO、一个简单的四边形(两个三角形组成一个矩形)和一个直通着色器,它只会在输出帧缓冲区中显示纹理的每个纹素。

此时,您可以使用 glReadPixels()将字节拉回到 CVPixelBufferRef 的内部字节数组中,或者最好使用纹理缓存来消除读取的需要。我在 this answer 中描述了如何为该方法设置缓存,以及如何将其输入 AVAssetWriter。您需要将屏幕外 FBO 设置为使用 CVPixelBufferRef 的关联纹理作为渲染目标才能正常工作。

但是,如果您有办法设置此渲染纹理使用的 ID,则可以避免重新渲染它以获取其像素值。像我在上面链接的答案中描述的那样设置纹理缓存,并将该像素缓冲区的纹理 ID 传递到您正在使用的第三方 API。然后它将渲染到与像素缓冲区关联的纹理中,您可以直接从中记录。这就是我用来在我的 GPUImage 框架中加速从 OpenGL ES 录制视频的方法(使用 glReadPixels() 方法作为 iOS 4.x 的后备)。

关于iphone - 将纹理复制到 PixelBuffer (CVPixelBufferRef),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16716085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com