两个NSOpenGLContexts之间共享什么?

我试图创建一个NSOpenGLContext,初始化我的渲染引擎,然后使用第一个上下文中的共享参数创建新的NSOpenGLContext。 这是行不通的,在我继续之前,上下文之间究竟分享了什么? 这个文档有点亮:

共享上下文共享在启动共享之前和之后创建的所有纹理对象,显示列表,顶点程序,片段程序和缓冲区对象。 对象的状态也是共享的,但不是其他上下文状态,例如当前颜色,纹理坐标设置,矩阵和照明设置,栅格化状态以及纹理环境设置。

当我创建我的第一个NSOpenGLContext时,我初始化了我的渲染引擎,该引擎进行了以下类型的调用:

  • glGenTextures,glActiveTexture,glBindTexture
  • glEnable
  • glUseProgram,glGetAttribLocation,glGetUniformLocation
  • glUniform1i,glUniform3f
  • glGenVertexArraysAPPLE,glBindVertexArrayAPPLE,glBindBuffer
  • glVertexAttribPointer,glEnableVertexAttribArray
  • 其中大多数用于三种类型的任务 - 创建顶点和着色器程序,存储对程序内的attrib和统一位置的引用,创建顶点数组以及绑定一些纹理。

    你会期望所有这些项目在上下文中共享吗?


    函数调用不在上下文中共享。 只有对象。 只有一些物体。

    一般而言,共享的对象是那些明显禁止在另一个上下文中重新创建的对象。 要么是由于存储大量数据,要么是相对较长的设置时间。

    如果你想要一个列表,共享下列对象:

  • 显示列表
  • 纹理
  • Renderbuffers
  • 缓冲对象
  • 着色器和程序
  • 不共享的显着对象:

  • 顶点数组对象(进入它们的缓冲区对象是共享的,但不是对象本身)
  • Framebuffer对象(与VAO一样,只有共享它们的东西)
  • 被共享的对象意味着它在整个上下文中保持所有状态。 所以如果你从一个上下文中修改状态,你会在另一个上下文中看到它。 但是,这也意味着如果您使用多个线程,则必须同步对共享GL对象的访问。 否则会出现竞赛状况和其他不良情况。

    链接地址: http://www.djcxy.com/p/38485.html

    上一篇: What exactly is shared between two NSOpenGLContexts?

    下一篇: Opengles mixing VBO and non VBO renders gives EXC