版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shengpeng3344/article/details/84945157
问题描述
项目中使用GPUImage进行摄像头采集,同时对软解后的数据使用OpenGL渲染,这里借鉴了KxMovie的逻辑代码,当两者同时操作时,使得GPUImage图像倒置90度,并出现闪屏,图片失真问题,这里分享下KxMovie的一些问题,另外GPUImage也有部分问题需要改进
1、KxMovie的渲染视图大小有时不准确
当切换全屏和小屏时,opengl渲染大小设置不正确,相关代码如下
- (void)layoutSubviews
{
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
NSLog(@"failed to make complete framebuffer object %x", status);
} else {
NSLog(@"OK setup GL framebuffer %d:%d", _backingWidth, _backingHeight);
NSLog(@"OK setup GL %@", NSStringFromCGRect(self.frame));
}
[self updateVertices];
[self render: nil];
}
每次操作前都应该设置currentContext,故在代码前加一句
[EAGLContext setCurrentContext:_context];
可解决
2、KxMovie与GPUImage的layer重叠导致GPUImage的图片翻转90度
尽量保证不要在同一个UIView中初始化两个opengles layer就好,否则出现很多意想不到的问题
3、GPUImage预览视图闪烁问题
这个问题只有在创建KxMovie后,才会出现,具体原因也是释放opengl环境变量时currentContext没有设置,而GPUImage在自己的线程设置currentContext,多线程处理会导致上下文混乱
- (void)cleanRender
{
if ([EAGLContext currentContext] != _context) { // add this line , to resolve shine
[EAGLContext setCurrentContext:_context];
}
_renderer = nil;
if (vertex_shader) {
glDeleteShader(vertex_shader);
vertex_shader = 0;
}
if (fragment_shader) {
glDeleteShader(fragment_shader);
fragment_shader = 0;
}
if (_framebuffer) {
glDeleteFramebuffers(1, &_framebuffer);
_framebuffer = 0;
}
if (_renderbuffer) {
glDeleteRenderbuffers(1, &_renderbuffer);
_renderbuffer = 0;
}
if (_program) {
glDeleteProgram(_program);
_program = 0;
}
glFinish(); // add this line , need finish
if ([EAGLContext currentContext] == _context) {
[EAGLContext setCurrentContext:nil];
}
_context = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
}
具体可以参考KxMovie源码比较
所有对于opengl变量元素的操作应该在设置上下文后,尽量保持线程一致
另外GPUImage也有水印问题 https://blog.csdn.net/shengpeng3344/article/details/84944765