是否可以使用Open GL ES在屏幕外绘制以创建用作CALayer内容的CGImageRef。
我只打算更改图像一次。具体来说,我正在寻找一种有效的方法,只改变图像的色调,而不改变亮度。另一种解决方案可能是创建一个像素缓冲区,并直接更改数据,但它的计算成本似乎很高。
发布于 2011-06-06 14:48:05
虽然这不是我做过的事情,但它应该是可能的。
如果您查看Xcode中的当前OpenGL ES模板,特别是EAGLView.com,您将看到将其中的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,那么您最好使用一个携带CAEAGLLayer的UIView子类。它们的行为与任何其他视图完全相同-当您推送新数据时更新,以完全相同的方式合成-因此不会有额外的复杂性。唯一的缺点是,如果你是新手,OpenGL上的大多数教程和示例代码倾向于将设置为全屏,每秒更新60次,等等,这就是游戏想要的。
https://stackoverflow.com/questions/6253594
复制相似问题