OPENGL ES在 iOS中的层级关系如图。
在IOS应用程序中,每个线程都会维护一个当前上下文。当你的应用程序使用Opengl ES的调用时,线程的上下文就会被那个调用改变。
要设置当前上下文,你可以通过调用EAGLContext类的setCurrentContext:方法。
[EAGLContext setCurrentContext:myContext];
你的应用程序也可以通过EAGLContext类的currentContext方法来获取一个线程的当前上下文。
当你的应用程序设置了一个新的上下文时,EAGL会释放先前的上下文,并且获取新的上下文。
当你的应用程序创建和初始化EAGLContext对象时,可以来决定那种版本的Opengl ES会被支持。创建Opengl ES 2.0上下文时,你的应用程序可以如下初始化:
EAGLContext* myContext = [[EAGLContext alloc]
initWithAPI:kEAGLRenderingAPIOpenGLES2];
共享组最有用的是以下两种情况:
在不同的上下文中,共享的资源不会变化(双缓冲区的实现原理)
当你想要应用程序在一个线程中创建新的Opengl ES对象,而在主线程渲染时。在这种情况下,第二个上下文运行在一个独立的线程中,并且致力于获取数据和创建资源。在所有的资源都加载完成后,第一个上下文绑定到这些对象上,然后立即使用它。
创建多个上下文引用到同一个共享组的方法,首先第一个上下文通过调用initWithAPI:初始化,那么一个共享组就会自动的被创建。然后第二个或者之后的上下文初始化时,就可以通过调用initWithAPI:sharegroup:的方法使用第一个上下文创建的贡献组。第一个上下文通过使用快捷方法。第二个上下文是通过一个扩展的API传递了第一个上下文的共享组从而被创建。
重要:共享同一个共享组的所有的上下文,都必须使用同一个版本的Opengl ES API来初始化上下文。
- EAGLContext* firstContext = CreateBestEAGLContext();
- EAGLContext* secondContext = [[EAGLContext alloc] initWithAPI:[firstContext API]
- sharegroup: [firstContext sharegroup]];