如何在UIImagePickerController之上叠加GLKView

时间:2012-12-07 09:03:52

标签: overlay uiimagepickercontroller eaglview

我正在尝试使用GLKView在使用UIImagePickerController的摄像机的实时视频源上叠加OpenGL ES内容。我已经阅读了几本教程,书籍和帖子,但仍无法找到答案。我们阅读的一些帖子供您参考,hereherehere

在viewDidLoad中,我正在执行以下操作:

// Create an OpenGL ES 2.0 context and provide it to the view
// NOTE: viewOverlay is of class GLKView and a property of the view controller
viewOverlay.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
viewOverlay.opaque = NO;
viewOverlay.backgroundColor=[UIColor clearColor];

// Make the new context current
[EAGLContext setCurrentContext:viewOverlay.context];

// Create a base effect that provides standard OpenGL ES 2.0
// Shading Language programs and set constants to be used for 
// all subsequent rendering
self.baseEffect = [[GLKBaseEffect alloc] init];
self.baseEffect.useConstantColor = GL_TRUE;
self.baseEffect.constantColor = GLKVector4Make(
  1.0f, // Red
  0.0f, // Green
  0.0f, // Blue
  1.0f);// Alpha

// Set the background color stored in the current context 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // background color

在viewDidAppear中,我正在这样做:

    UIImagePickerController *uip;
    uip = [[UIImagePickerController alloc] init];
    uip.sourceType = UIImagePickerControllerSourceTypeCamera;
    uip.showsCameraControls = NO;
    uip.toolbarHidden = YES;
    uip.navigationBarHidden = YES;
    uip.wantsFullScreenLayout = YES;
    uip.cameraViewTransform = CGAffineTransformScale(uip.cameraViewTransform, CAMERA_TRANSFORM, CAMERA_TRANSFORM);
   [viewOverlay addSubview:uip.view];
   [viewOverlay sendSubviewToBack:uip.view];
   [viewOverlay bringSubviewToFront:viewOverlay];

如果我单步执行该程序,我可以看到OpenGL对象被渲染一次。但是,当UIImagePickerController作为子视图添加时,它是屏幕上唯一的东西。如果我注释掉最后三行,则会渲染OpenGL对象,但当然相机不可见。

我希望相机的视频图像能够在我正在绘制的OpenGL对象的背面渲染。创建增强现实效果。任何和所有的帮助将不胜感激!

麦克

1 个答案:

答案 0 :(得分:1)

您希望相机做什么 - 只显示AR效果的相机视图,或者实际使用/操作图像数据?如果您需要除简单AR显示以外的任何其他内容,请使用AVFoundation。

我之前遇到过这方面的麻烦并阅读了相同的帖子,所以我提供了两个解决方案:

1)使用容器视图

在storyboard文件中,创建一个UIViewController,其中包含用于摄像头的UIView和一个顶部的Container View,其中segue连接到GLKViewController。将您的主UIViewController链接到您的摄像头代码,并将您的GLKViewController链接到您的OpenGL ES代码。当UIViewController可见时,容器内的UIView和GLKView将分别加载和运行。

2)App委托黑客

在app委托中设置 UIImagePickerController ,特别是方法:

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

然后,将子视图添加到您的窗口属性中。这将始终确保您的相机在任何视图之前加载到您的窗口,并确保它位于图层堆栈的底部。