如何配置OpenGL ES的上下文(OpenGL ES2.0官方文档翻译)
OpenGL ES的每种实现,都会有个方法,来创建渲染图形的上下文,从而可以管理Opengl ES指定的状态。通过放置这些状态到上下文中,这样在多任务的情况下,就很容易的共享图像的硬件设备,从而互不影响各自的状态。
这一章就是来详解,如何创建和配置IOS中的图形上下文。
图 2-1 两个上下文共享一个Opengl ES对象
共享组最有用的是以下两种情况:
在不同的上下文中,共享的资源不会变化
当你想要应用程序在一个线程中创建新的Opengl ES对象,而在主线程渲染时。在这种情况下,第二个上下文运行在一个独立的线程中,并且致力于获取数据和创建资源。在所有的资源都加载完成后,第一个上下文绑定到这些对象上,然后立即使用它。
创建多个上下文引用到同一个共享组的方法,首先第一个上下文通过调用initWithAPI:初始化,那么一个共享组就会自动的被创建。然后第二个或者之后的上下文初始化时,就可以通过调用initWithAPI:sharegroup:的方法使用第一个上下文创建的贡献组。清单2-2展示了如何工作。在清单2-1中,第一个上下文通过使用快捷方法。第二个上下文是通过一个扩展的API传递了第一个上下文的共享组从而被创建。
重要:共享同一个共享组的所有的上下文,都必须使用同一个版本的Opengl ES API来初始化上下文。EAGLContext* firstContext = CreateBestEAGLContext();EAGLContext* secondContext = [[EAGLContext alloc] initWithAPI:[firstContext API]sharegroup: [firstContext sharegroup]];清单 2-2 用同一个共享组创建2个上下文
当共享组是被多个上下文共享时,你的应用程序就有义务要管理Opengl ES对象状态的改变。规则如下:
当你的应用程序可能要通过多个上下文进入某个对象的同时,要确保对象没有被同时改变。
当对象要被发给上下文的命令改变时,对象此时不能被另外的上下文读取或者改变。
在一个对象被改变时,必须是被绑定对象的所有的上下文才能看到这些改变。如果一个上下文在绑定之前就引用它,那么这个对象的内容是没有被定义的。
这里有一些步骤,是你在更新Opengl ES对象需要遵循的:
1 在每一个可能使用该对象的上下文中调用glFlush方法
2 在某个上下文想要改变对象的同时,调用一个或者更多的Opengl ES的函数来改变对象
3 在接收到上下文状态改变的通知时,调用glFlush函数
4 在每个其他的上下文中,绑定对象的标志。
注意:共享对象的另一个方法是去使用单一的渲染上下文,但是多个目的缓冲帧。在渲染时,你的应用程序绑定需要的缓冲帧,然后渲染成需要的帧。因为所有的Opengl ES对象都是从单一的上下文中渲染的,所以他们看到的是同样的Opengl ES的数据。这个方式使用的资源很少,但是仅仅对单线程的应用程序有用,在单线程中你可以很好的控制上下文的状态。