增强现实:OpenGL视图上的摄像头流

时间:2012-07-23 20:53:02

标签: ios opengl-es avfoundation glkit

AR(增强现实)似乎是所有iO开发人员目前都在关注的问题。我正在玩一个非常经典的宠物项目,用纹理滚动骰子,如果可能的话,骰子面上的相机流。我在最后一部分面临一些问题,我对专家提出了一些问题:

获取视频流需要AV Foundation:AVCaptureVideoDataOutputSampleBufferDelegate来获取图像缓冲区,然后使用像UIImage这样的Quartz函数构建CGBitmapContextCreate。这在http://www.benjaminloulier.com/articles/ios4-and-direct-access-to-the-camera或Apple AV Foundation Programming Guide(参见https://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW30

中进行了演示

然后我可以为我的“静止”图像创建一个纹理,并将其与GLKBaseEffect(或着色器?)一起使用。

问题1:GLKBaseEffect看起来非常简单,但我应该针对OpenGL 2和着色器吗?

现在Apple的RosyWriter演示使用Core Video CVOpenGLESTextureCacheCreateTextureFromImage函数直接绑定纹理,而不创建中间UIImage。这是 - 如演示说明中所述 - IOS 5中的新内容。

问题2:这是映射纹理的更好方法吗?

问题3:有一些有趣的框架,如GPUImage,甚至可以使用的3D游戏框架。有没有人对使用这些有什么反馈?到目前为止,苹果提供的框架对我来说似乎相当完整。

非常感谢!

1 个答案:

答案 0 :(得分:3)

回答您的各种问题:

  

GLKBaseEffect似乎非常简单,但我应该瞄准   OpenGL 2和着色器?

GLKBaseEffect只是一些简单的OpenGL ES 2.0着色器的包装器,所以它的核心是2.0。虽然GLKit提供了一些不错的便利,但最终你需要创建默认情况下无法提供的效果,所以你很可能需要学习如何在某些时候做自己的顶点和片段着色器。我列出了一些用于在this answer中学习这些资源的资源。

  

现在Apple的RosyWriter演示使用Core Video   CVOpenGLESTextureCacheCreateTextureFromImage函数直接绑定   纹理没有创建中间UIImage。这是 - 作为   在演示说明中说明 - IOS 5中的新内容。

     

问题2:这是映射纹理的更好方法吗?

是的,在iOS 5.0上,使用纹理缓存上传视频帧可以带来一些可靠的性能提升。对于iPhone 4S,我看到使用纹理缓存时,帧上传时间从640毫秒到640毫秒到1.8毫秒。 reading from the texture caches to encode video时可以获得更大的好处。

  

问题3:有一些有趣的框架,如GPUImage,或   甚至可以使用的3D游戏框架。有没有人   使用这些的反馈?苹果提供的框架似乎相当   到目前为止我已经完成了。

我建议使用GPUImage,但我有点偏颇,看我是怎么写的。作为一个更具体的观点,我几乎完全按照您在框架的示例代码中的CubeExample中描述的内容(读取视频帧并将它们映射到旋转立方体的两侧)。

这个例子有点复杂,因为我拍摄现场视频,通过棕褐色调过滤器,将其作为纹理读取并将其显示在可以用手指旋转的三维立方体上,然后通过像素化过滤器获取多维数据集的渲染视图。但是,您可以从此示例中仅提取所需的部分。通过这样做,您将节省大量代码,因为我负责视频捕获并上传到OpenGL ES。