Один EAGLContext заставляет другой EAGLContext не работать с iOS OpenGL

У меня есть два класса для отображения разных CIImage. Они оба имеют одинаковый способ создания объектов OpenGL, как в следующем примере.

_context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];
    _coreImageContext = [CIContext contextWithEAGLContext:_context];
    _localCameraView = [[GLKView alloc]initWithFrame:self.localCameraViewPlayingRect context:_context];
    _localCameraView.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    _localCameraView.context = _context;
    glGenRenderbuffers(1, &_renderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);

после одного glkview, показывающего ciImage, я запускаю другой EAGLContext, чтобы показать другой CIImage. Другие объекты openGL создаются, как показано ниже.

_context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];
        _coreImageContext = [CIContext contextWithEAGLContext:_context];
        _cameraView = [[GLKView alloc]initWithFrame:self.playingRect context:_context];
        _cameraView.drawableDepthFormat = GLKViewDrawableDepthFormat24;
        _cameraView.context = _context;
        glGenRenderbuffers(1, &_renderBuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);

Я использую тот же способ, чтобы показать ciimage, но они по-разному. 1.

    if(_coreImageContext && _context)
{
    [_cameraConnectorLocker lock];
    if(_cameraConnectorLocker && _context)
    {
        [_coreImageContext drawImage:ciImage inRect:CGRectMake(0, 0, self.cameraView.drawableWidth, self.cameraView.drawableHeight) fromRect:[ciImage extent]];
        [_context presentRenderbuffer:GL_RENDERBUFFER];

    }
    [_cameraConnectorLocker unlock];
}

2.

if(_coreImageContext && _context)
{
    [_outputVideoLock lock];
    if (_coreImageContext && _context) {

        [_coreImageContext drawImage:image inRect:CGRectMake(0, 0, self.localCameraView.drawableWidth, self.localCameraView.drawableHeight) fromRect:[image extent]];
        [_context presentRenderbuffer:GL_RENDERBUFFER];

    }
    [_outputVideoLock unlock];
}

если эти два объекта EAGLContext создаются одновременно, два GLKView будут показывать два разных видео. если один создается первым, то другой создается позже, более поздний будет отображаться нормально, первый застрянет. Я не знаю, как это исправить, может кто-нибудь мне помочь? огромное спасибо.


person Lawrence Zhang    schedule 19.10.2017    source источник


Ответы (1)


после исследования и тестирования два GLKViews могут показывать видео один за другим с кодом ниже

 _context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];
    [EAGLContext setCurrentContext:_context];

если нет кода [EAGLContext setCurrentContext:_context], один GLKView заблокирует показ другого GLKView

person Lawrence Zhang    schedule 20.10.2017