2011-06-06 54 views
0

是否可以使用Open GL ES画外屏来创建CGImageRef以用作CALayer的内容。Openg GL ES画外屏提供CALayer的内容

我打算只改变图像一次。详细我正在寻找一种有效的方式来改变图像的色调而不改变亮度。另一种解决方案可能是创建一个像素缓冲区并直接更改数据,但这在计算上似乎很昂贵。

回答

0

虽然这不是我所做的,但它应该是可能的。

如果你看看在Xcode中,尤其是EAGLView.m当前的OpenGL ES模板,你会看到,结合OpenGL上下文中出现在屏幕的部分是:

  • 线77,[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; ,它告诉CAEAGLLayer为正在创建的framebuffer对象提供足够的细节,以便它可以在屏幕上显示。
  • line 128,success = [context presentRenderbuffer:GL_RENDERBUFFER];,它给了CAEAGLLayer点头,你已经画出了一个全新的框架,它应该尽可能呈现。

,你应该能够做的是转储CAEAGLLayer完全连接(因此,你不需要创建一个UIView子类),使用glRenderbufferStorageglRenderbufferStorageMultisampleAPPLE分配一个颜色缓存为您的帧缓冲,而不是(所以它具有存储空间,但是在OpenGL感觉就像放置它的地方),请执行所有绘制,然后使用glReadPixels获取像素内容。

从那里您可以使用CGDataProviderCreateWithDataCGImageCreate将原始像素数据转换为合适的CGImageRef。

GPU的东西应该比通常在CPU上管理的速度快很多,但是您的主要成本可能是上传和下载。如果您实际上并不需要它作为CGImageRef而不是将它显示在屏幕上,那么最好使用CAEAGLLayer来装载UIView子类。它们的作用与其他视图完全相同 - 更新是否以及何时推送新数据,以完全相同的方式合成 - 因此没有额外的复杂性。唯一的缺点是,如果您是新手,那么OpenGL上的大多数教程和示例代码都倾向于将事物设置为全屏,每秒更新60次等,这些都是游戏所需。