美文网首页OpenGL ES
配置OpenGLES 上下文  译文

配置OpenGLES 上下文  译文

作者: 剁椒鸡蛋zy | 来源:发表于2017-05-12 11:59 被阅读517次

    翻译

    OpenGL ES的每一 实现方式提供了一种方法来创建渲染环境管理由OpenGL ES规范要求的状态 。通过将该状态置于上下文中,多个应用程序可以轻松地共享图形硬件而不干扰其他状态。

    EAGLContext 是OpenGLES 渲染上下文的iOS系统的实现方式

    在你的应用程序可以调用任何OpenGL ES 功能之前,必须初始化一个EAGLContext对象。EAGLContext类还提供了用于集成OpenGL ES的内容 核心动画的方法。

    当前上下文是OpenGL ES的函数调用的目标

    在iOS应用程序中每个线程都有一个当前上下文;当你调用OpenGL ES 功能,这是它的状态是由函数调用改变的上下文。
    当在一个线程上执行的时候,调用EAGLContext的方法 setCurrentContext:去设置当前线程的当前上下文。
    调用 currentContext方法获取当前线程的上下文。

    如果你的应用程序在一个线程里面切换两个或者多个上下文,在设置新上下文前需要调用glflush函数。这确保以前提交的命令被及时传递到图形硬件。

    OpenGL ES 对 当前上下文EAGLContext对象强引用。当调用setCurrentContext:切换上下文的时候,OpenGL ES 不会在引用上下文对象,所有你自己需要保持一个强引用,以防被dealloc。

    每个上下文只支持一个版本的OpenGL ES

    一个EAGLContext 对象只支持一个版本的opengl。
    所有当创建EAGLContext对象的时候,如果你的设备不支持某个版本的OpenGL,initWithAPI:方法会返回nil。

    EAGLContext* CreateBestEAGLContext()
    {
       EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
       if (context == nil) {
          context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
       }
       return context;
    }
    

    一个EAGL Sharegroup 管理上下文的OpenGL ES 对象

    虽然OpenGL ES管理上下文的状态,它并不直接管理 OpenGL ES的对象。相反, EGLSHAREGROUP对象创建和维护OpenGL ES对象。每个上下文包含一个对象,它代表eaglsharegroup对象产生.
    一个sharegroup的优势变得明显,当两个或两个以上的contexts指的是同一个sharegroup,如图2-1所示。当多个上下文连接到一个共同的共享组,所有的上下创建的OpenGL ES的对象可以被所有上下文共享;当你在另一个上下文中绑定了和创建它的上下文相同的对象identifier,那么你就引用了相同的OpenGL ES对象。移动设备上的资源往往是稀缺的;在多个上下文中创建同一内容的多个副本是浪费。共享公共资源可以更好地利用设备上可用的图形资源。
    一个共享组是一个不透明的对象;它没有方法或属性供你调用。上下文对sharegroup保持。

    配置OpenGLES 上下文  译文

    sharegroups在两个特定的情景下最有用:

    1. 当上下文之间共享的大部分资源是不变的。
    2. 当你希望你的应用程序能够在非主线程中创建新的OpenGL ES对象来渲染。在这种情况下,第二个上下文运行在单独的线程上,专门用于获取数据和创建资源。在加载资源后,第一个上下文可以绑定到对象并立即使用它。这时GLKTextureLoader类 专门用来提供异步的纹理加载。

    创建多个上下文引用相同的共享组,第一个上下文是通过调用initwithapi初始化,sharegroup对象自动创建。第二和后来的上下文中被初始化initWithAPI:sharegroup:。清单2-2显示了这将如何工作。

    共享一个sharegroup的所有上下文必须使用相同版本的Opengl。

    EAGLContext* firstContext = CreateBestEAGLContext();
    EAGLContext* secondContext = [[EAGLContext alloc] initWithAPI:[firstContext API] sharegroup: [firstContext sharegroup]];
    

    当sharegroup被对个上下文共享的时候,管理OpenGL ES objects的状态变化是你的app的责任。下面是规则:

    1. 你的app可以在不同的上下文中访问同一个object 同时地,这个object不能被修改。
    2. 当一个object被yigecontext修改的时候,这个object不能被其他context读写。
    3. 当一个object被修改了,所有的context只有重新bind才能看到改变。当一个context在bind之前就引用了一个object,那么这个object的内容是undefined。

    下面是更新一个OpenGL ES对象的步骤:

    1. 所有可能使用这个object的context调用glFlush
    2. 在想修改这个object的上下文下,调用OpenGL方法去修改这个对象。
    3. 在收到state-modifying命令的上下文上面调用glFlush
    4. 在其他context上重新绑定

    注意: 另一种方式来共享的对象办法是使用一个单一的渲染上下文,但多个目的帧缓存。在渲染时,你的应用程序绑定适当的framebuffers然后渲染。因为所有的OpenGL ES 对象被一个上下文引用,他们看到同样的OpenGL ES数据 。此模式使用较少的资源,但只适用于单线程应用程序,您可以仔细控制上下文的状态

    相关文章

      网友评论

        本文标题:配置OpenGLES 上下文  译文

        本文链接:https://www.haomeiwen.com/subject/piuztxtx.html