Один 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 покажут два разных видео. если один создается первым, другой создается позже, более поздний будет отображаться нормально, первый будет зависать. Я не знаю, как это исправить, кто-то может мне помочь? большое спасибо.
1 ответ
После исследования и тестирования два GLKView могут показывать видео по одному с приведенным ниже кодом
_context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];
[EAGLContext setCurrentContext:_context];
если нет кода [EAGLContext setCurrentContext:_context], один GLKView заблокирует другой GLKView, показывая