我正试图使用GLKView将OpenGL ES内容覆盖在使用UIImagePickerController的摄像机实时视频馈送之上。我读了一些教程、书籍和帖子,但仍然找不到答案。为了供你参考,我读过的一些帖子在这里,这里和这里。
在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
在视图中我正在这样做:
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对象的背面渲染相机的视频图像。创建增强现实效果。如有任何帮助,我们将不胜感激!
Mike
你想让你的相机做什么-只显示一个AR效果的相机视图,或者也实际使用/操纵图像数据?如果您需要简单的AR显示器以外的任何东西,请使用AVFoundation。
我以前在这方面遇到过很多麻烦,读过和你相同的帖子,所以我提供了两个解决方案:
1)使用容器视图
在情节提要文件中,创建一个UIViewController,其中包含相机的UIView和顶部的Container View,其中segue连接到GLKViewController。将主UIViewController链接到相机代码,并将GLKViewController链接到OpenGL ES代码。当UIViewController可见时,容器内的UIView和GLKView将分别加载和运行。
2)应用程序代理破解
在应用程序委托中设置UIImagePickerController,特别是方法:
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
然后,将子视图添加到窗口属性中。这将始终确保您的相机在任何视图之前加载到窗口上,并确保它位于层堆栈的底部。