1

我正在构建一个应用程序,它需要显示到 opengl 视图,一个全屏,另一个更小作为覆盖。这两个视图代表 2 个完全不同的应用程序。

现在看来我不能同时显示两个 EAGLContext/Framebuffers;我总是以“无法制作完整的帧缓冲区对象 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- 在我的第二个实现中,我需要手动创建帧缓冲区,而不使用这样的 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);
4

2 回答 2

2

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

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

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

请注意,一般来说,最好避免使用 openGL 的多个视图。没有什么是你不能用 1 个视图处理的,在大多数情况下,要实现 2 个窗口,你需要做的就是调用另一个窗口glViewport来绘制视图的另一部分。

于 2013-04-23T13:58:01.897 回答
1

在 GitHub 上有一个示例应用程序

该应用程序有一个 root GLKViewControllerGLKViewController它可以模态地呈现一个容器视图控制器,它使用子视图控制器机制嵌入了另外两个。当显示模态视图时,两个嵌入GLKViewController的 s 同时动画。

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

于 2016-11-06T02:23:06.283 回答