将GPUImage与另一个EAGLContext一起使用

时间:2014-04-24 22:24:56

标签: iphone opengl-es gpuimage

我正在尝试将GPUImage与基于OpenGL的照片编辑应用一起使用。问题是,似乎两个OpenGL上下文冲突意味着GPUImage无法正常运行。

我在尝试使用GPUImage之前添加了这个:

[EAGLContext setCurrentContext:[GPUImageContext sharedImageProcessingContext].context];

但它没有帮助。我所看到的问题是,当我尝试将滤镜应用于图像时,它会将滤镜应用于先前过滤的图像,即

1)过滤图像1 - 输出图像2

2)重新加载我的OpenGL图片画布

3)过滤图像2 - 输出图像2(应为图像3,即图像2的过滤版本)

这种情况发生在我应用过滤器的前三次,然后它开始正常工作。有没有办法重置GPUImage上下文?或者处理GPUImage上下文单例并重新开始?

1 个答案:

答案 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的等价物。