我正在尝试将GPUImage
与基于OpenGL
的照片编辑应用一起使用。问题是,似乎两个OpenGL
上下文冲突意味着GPUImage
无法正常运行。
我在尝试使用GPUImage
之前添加了这个:
[EAGLContext setCurrentContext:[GPUImageContext sharedImageProcessingContext].context];
但它没有帮助。我所看到的问题是,当我尝试将滤镜应用于图像时,它会将滤镜应用于先前过滤的图像,即
1)过滤图像1 - 输出图像2
2)重新加载我的OpenGL图片画布
3)过滤图像2 - 输出图像2(应为图像3,即图像2的过滤版本)
这种情况发生在我应用过滤器的前三次,然后它开始正常工作。有没有办法重置GPUImage
上下文?或者处理GPUImage
上下文单例并重新开始?
答案 0 :(得分:2)
首先,您需要确保基于OpenGL的绘图应用程序将其场景渲染为纹理,并且您正在使用纹理输入(如果传入GPUImage)。 GPUImage需要使用纹理,而不是渲染缓冲区本身。如果从GPUImage出去,请使用纹理输出及其渲染回调块来了解渲染何时结束。
要在GPUImage和另一个OpenGL上下文之间共享内容,您需要使GPUImage的上下文与您自己的OpenGL上下文成为相同共享组的一部分。最好不要直接共享GPUImage上下文,因为它在后台调度队列内部执行操作,如果在自己的代码中渲染,则无法保证线程安全。
iOS端的CubeExample示例应用程序显示了如何为OpenGL ES执行此操作。特别是,它使用以下行:
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[[[GPUImageContext sharedImageProcessingContext] context] sharegroup]];
设置用于在那里进行非GPUImage渲染的OpenGL ES上下文的共享组。不过,我必须查看Mac和桌面OpenGL的等价物。