是否可以使用Open GL ES在屏幕外绘制以创建CGImageRef以用作CALayer的内容。
我打算只改变一次图像。详细地说,我正在寻找一种有效的方法来改变图像的色调而不改变亮度。另一种解决方案可能是创建一个像素缓冲区并直接更改数据,但这看起来很昂贵。
答案 0 :(得分:0)
虽然这不是我做过的事情,但它应该是可能的。
如果您查看Xcode中的当前OpenGL ES模板,尤其是EAGLView.m,您将看到将OpenGL上下文绑定到屏幕的部分是:
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
,它告诉CAEAGLLayer为创建的帧缓冲区对象提供足够的详细信息,以便它可以显示在屏幕上。success = [context presentRenderbuffer:GL_RENDERBUFFER];
,它为CAEAGLLayer提供了一个你已经绘制了一个全新框架的点头,它应该尽可能地显示出来。您应该能够完全转储CAEAGLLayer连接(因此,您不需要创建UIView子类),使用glRenderbufferStorage
或glRenderbufferStorageMultisampleAPPLE
来分配颜色缓冲区对于你的帧缓冲(因此它有存储,但OpenGL感觉就像把它放在哪里),做你的所有绘图,然后使用glReadPixels
来获取像素内容。
从那里,您可以使用CGDataProviderCreateWithData
和CGImageCreate
将原始像素数据转换为合适的CGImageRef。
GPU的东西应该比你在CPU上正常管理要快很多,但你的主要成本可能是上传和下载。如果你实际上不需要它作为CGImageRef而不是在屏幕上显示它,那么你最好只使用携带UIView子类的CAEAGLLayer。它们的行为与任何其他视图完全相同 - 更新是否以及何时推送新数据,以完全相同的方式合成 - 因此没有额外的复杂性。唯一的缺点是,如果你是新手,那么OpenGL上的大多数教程和示例代码都倾向于将设置设置为全屏,每秒更新60次等等,这就是游戏所需要的。