如何将OpenGL ES纹理转换为CIImage

3
我知道如何采取另一种方法。但是,如何从纹理创建CIImage,而无需复制到CPU内存中?[CIImage imageWithData]?CVOpenGLESTextureCache?

仅针对iOS 6的更新,现在已经可以实现。 - akaru
3个回答

4
很遗憾,我认为没有任何方法可以避免使用glReadPixels()读取像素数据。 CIImage的所有输入(数据,CGImageRef,CVPixelBufferRef)都在CPU端,因此我看不到将其快速传递到CIImage的路径。 在那里,您最好的选择是使用glReadPixels()从纹理中提取原始RGBA数据,并使用-initWithData:options:kCIFormatRGBA8像素格式将其发送到CIImage中。(更新:2012年3月14日)在iOS 5.0上,现在有一种更快的抓取OpenGL ES帧数据的方法,使用新的纹理缓存。 我在this answer中详细描述了这一点。
然而,还有另一种方法可以实现你想要的目标。如果你只是想在屏幕上应用纹理滤镜,你可能可以使用我的GPUImage框架来进行处理。它已经将OpenGL ES 2.0作为其渲染管道的核心,并使用纹理作为图像或视频帧从一个滤镜传递到另一个滤镜的方式。在我的基准测试中,它也比Core Image快得多。
你可以将你的纹理作为输入提供给这里,这样它就不必接触CPU。我还没有一个用于从OpenGL ES抓取原始纹理的库存类,但你可以修改现有的GPUImageOutput子类的代码,以便将其作为源相对容易地使用。然后你可以链接滤镜,并将输出指向屏幕或静止图像。在某些时候,我会添加这种数据源的类,但这个项目仍然相当新。

1
谢谢,Brad。你有使用过CVOpenGLESTextureCache吗?如果没有其他方法,它似乎应该是glReadPixels的替代品。在OS X上有一个专门回答我的问题的方法,由于苹果公司专注于GPU,所以似乎必须有一种方法... - akaru
@akaru - 除非我漏掉了什么,CVOpenGLESTextureCache只是用于快速单向上传纹理。我认为它不能用于从OpenGL ES纹理中读取任何内容。在头文件或苹果关于此主题的演示中,我没有看到任何参考资料。我认为我们在iOS上只能使用glReadPixels() - Brad Larson
@akaru - 我找不到你之前关于这个问题的提问了,但是我错了,关于纹理缓存是单向的。我刚刚让它们能够编码视频,它们比 glReadPixels() 要快得多:https://dev59.com/Qmkw5IYBdhLWcg3w8O-o#9704392 - Brad Larson

3

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接