无法同时显示2个GLKViewController

时间:2013-04-23 13:34:46

标签: iphone ios opengl-es

我正在构建一个应用程序,需要向opengl视图显示,一个全屏,另一个较小的覆盖。这两个视图代表了两个完全不同的应用程序。

现在看来我不能同时显示两个EAGLContext / Framebuffers;我总是最终得到“Failed to make framebuffer object 8cd6”错误消息。

我需要使用两种不同的实现来实现2 gl视图:

1-在同一屏幕上同时使用2个GLKViewControllers

嗨,我已经阅读了一些针对这个问题的解决方案,大多数人说你只需要使用视图控制器遏制,但我试过没有运气。在我的设置中,每个glview我有一个EAGLContext ...我也尝试使用单个上下文。 这是我对第一个GLKViewController的viewDidLoad()方法的设置:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    [self setupGL];

    // Add the sub glkviewcontroller
    subViewController = [[SubGLControllerViewController alloc] init];

    [self addChildViewController:subViewController];
    [self.view addSubview:subViewController.view];
    [subViewController didMoveToParentViewController:self];
}

我对SubGLControllerViewController的代码基本相同,但是没有添加子视图控制器......

2-在我的第二个实现中,我需要手动创建我的framebuffers而不使用像这样的glkviewcontroller:

// Create the MAIN FBO.
glGenFramebuffers(1, &mainFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, mainFramebuffer);

glGenRenderbuffers(1, &mainColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mainColorRenderbuffer);

[mainContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];

glFramebufferRenderbuffer(GL_FRAMEBUFFER, 
                             GL_COLOR_ATTACHMENT0,
                             GL_RENDERBUFFER,
                             mainColorRenderbuffer);

// Create the secondary FBO
glGenFramebuffers(1, &secondaryFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, secondaryFramebuffer);

glGenRenderbuffers(1, &secondaryColorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, secondaryColorRenderbuffer);

[secondaryContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer];

glFramebufferRenderbuffer(GL_FRAMEBUFFER, 
                             GL_COLOR_ATTACHMENT0,
                             GL_RENDERBUFFER,
                             secondaryColorRenderbuffer);

// This status will fail at this point...if i remove either the main or secondary        //framebuffer, the status is valid
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

2 个答案:

答案 0 :(得分:1)

至于第一次尝试,我甚至不指望能够工作。

第二个问题只有一个问题:你使用同一个图层两次。正如您所说,您希望使用openGL创建2个视图,因此创建2个视图并使用每个视图的层。

至于上下文我建议你只使用1并且你在一个线程上严格执行所有GL工作,例如在视图控制器中创建一个NSTimer,它将“激活”两个视图的调用绘制方法并且记住每次切换想要绘制的视图时都需要绑定帧缓冲区。

请注意,一般来说,使用openGL避免多个视图似乎是最好的。在1个视图中你无法处理任何事情,在大多数情况下,要实现2个窗口你需要做的就是调用另一个glViewport绘制到视图的另一部分。

答案 1 :(得分:0)

我有example app available on GitHub

该应用有一个根GLKViewController。它可以模态地呈现容器视图控制器,它使用子视图控制器机制再嵌入两个GLKViewController。显示模态视图时,两个嵌入的GLKViewController同时进行动画处理。

每个GLKViewController都有自己的EAGLContext。我还没有尝试过让GL视图在iOS上共享上下文,所以在这个方案中,每个视图都必须加载自己的每个资源的副本。