我正在尝试将 GPUImage 集成到 cocos2d-swift (SpriteBuilder) 项目中,以便我可以在我的应用程序中使用视频过滤器。我让 GPUImage 在示例中正常工作,所以我继续添加框架并按照 README 将 GPUImage 放入我导出的 SpriteBuilder 项目中,该项目加载 MainScene。但是,一旦我尝试使用 GPUImage 中的任何内容,我就会收到一堆 OpenGL 错误并且应用程序崩溃。
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at -[CCGraphicsBufferGLUnsynchronized commit] 179
OpenGL error GL_INVALID_OPERATION detected at -[CCGraphicsBufferGLUnsynchronized commit] 179
OpenGL error GL_INVALID_OPERATION detected at CCRenderStateGLTransition 285
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at CCRenderStateGLTransition 285
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at CCRenderStateGLTransition 285
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at -[CCGraphicsBufferGLUnsynchronized prepare] 170
OpenGL error GL_INVALID_VALUE detected at -[CCGraphicsBufferGLUnsynchronized prepare] 170
OpenGL error GL_INVALID_VALUE detected at -[CCGLView presentFrame] 463
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at -[CCGraphicsBufferGLUnsynchronized commit] 179
OpenGL error GL_INVALID_OPERATION detected at -[CCGraphicsBufferGLUnsynchronized commit] 179
OpenGL error GL_INVALID_OPERATION detected at CCRenderStateGLTransition 285
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at CCRenderStateGLTransition 285
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at CCRenderStateGLTransition 285
OpenGL error GL_INVALID_FRAMEBUFFER_OPERATION detected at -[CCGraphicsBufferGLUnsynchronized prepare] 170
OpenGL error GL_INVALID_VALUE detected at -[CCGraphicsBufferGLUnsynchronized prepare] 170
OpenGL error GL_INVALID_VALUE detected at -[CCGLView presentFrame] 463
我已经注释掉了所有内容并尝试逐行取消注释以查看导致崩溃的原因,并且每当实例化任何 GPUImage 类时都会发生这种情况。在这种情况下,简单地创建一个 GPUImageMovie 对象就会导致崩溃:
let movieFile = GPUImageMovie(playerItem: playerItem)
创建 GPUImageGrayscaleFilter 或 GPUImageView 也会导致它。我需要在我的应用程序中做的就是显示视频或相机并对其应用过滤器,它本身非常简单;但是一旦引入 cocos2d-swft,就会出现很多问题。
我看到有些人提到关于共享组和 gl 上下文的事情,并且 GPUImage 和 cocos2d 相互冲突,但我还没有找到有人解释如何真正让它工作。
整个 MainScene.swift 文件如下(场景中有一个按钮调用 playVideo 函数,就是这样)。
import Foundation
import GPUImage
class MainScene: CCNode {
func playVideo() {
let mediaURL : NSURL! = NSBundle.mainBundle().URLForResource("BigBuckBunny_640x360", withExtension: "m4v")
let mainPlayer : AVPlayer! = AVPlayer()
let playerItem : AVPlayerItem! = AVPlayerItem(URL: mediaURL)
let movieFile = GPUImageMovie(playerItem: playerItem)
movieFile.runBenchmark = false
movieFile.playAtActualSpeed = true
let filter = GPUImageGrayscaleFilter()
movieFile.addTarget(filter)
let mainView = CCDirector.sharedDirector().view;
let filterView : GPUImageView! = GPUImageView(frame: CGRectMake(0, 0, 640, 360))
mainView.addSubview(filterView)
filter.addTarget(filterView)
movieFile.startProcessing()
mainPlayer.play()
}
}