1

我正在尝试使用 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

在 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 对象的后面。创建增强现实效果。任何和所有的帮助将不胜感激!

麦克风

4

1 回答 1

1

你想让你的相机做什么 - 只是显示一个 AR 效果的相机视图,或者也实际使用/操作图像数据?如果您需要简单的 AR 显示器以外的任何东西,请使用 AVFoundation。

我之前遇到过很多麻烦并阅读了您的相同帖子,因此我提供了两种解决方案:

1) 使用容器视图

在您的故事板文件中,创建一个 UIViewController,其中包含一个用于相机的 UIView 和一个顶部的容器视图,其中一个 segue 连接到一个 GLKViewController。将您的主 UIViewController 链接到您的相机代码,并将您的 GLKViewController 链接到您的 OpenGL ES 代码。当 UIViewController 可见时,容器内的 UIView 和 GLKView 都会单独加载和运行。

2) 应用委托黑客

在应用程序委托中设置您的UIImagePickerController ,特别是方法:

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

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

于 2012-12-23T12:24:13.987 回答