两个NSOpenGLContexts之间究竟分享了什么?

时间:2012-02-29 07:39:11

标签: objective-c macos opengl nsopenglview

我正在尝试创建一个NSOpenGLContext,初始化我的渲染引擎,然后使用第一个上下文中的share参数创建新的NSOpenGLContexts。这不起作用,在我继续之前,上下文之间究竟分享了什么?文档对此有点了解:

  

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

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

  • glGenTextures,glActiveTexture,glBindTexture
  • glEnable
  • glUseProgram,glGetAttribLocation,glGetUniformLocation
  • glUniform1i,glUniform3f
  • glGenVertexArraysAPPLE,glBindVertexArrayAPPLE,glBindBuffer
  • glVertexAttribPointer,glEnableVertexAttribArray

其中大部分都是针对三种类型的任务 - 创建顶点和着色器程序,存储对attrib的引用和程序中的统一位置,创建顶点数组以及绑定一些纹理。

您是否希望所有这些项目在不同情境中共享?

1 个答案:

答案 0 :(得分:4)

不跨上下文共享函数调用。只有对象。并且只有一些对象。

通常,共享的对象是那些显然无法在另一个上下文中重新创建的对象。要么存储大量数据,要么设置时间相对较长。

如果需要列表,则共享以下对象:

  • 显示列表
  • 纹理
  • Renderbuffers
  • 缓冲对象
  • 着色器和程序

未共享的重要对象:

  • 顶点数组对象(进入它们的缓冲区对象是共享的,但不是对象本身)
  • 帧缓冲对象(与VAO一样,只共享其中的内容)

共享对象意味着它维护整个上下文中的所有状态。因此,如果您从一个上下文修改状态,您将在另一个上下文中看到它。但是,这也意味着如果您使用多个线程,则必须同步对共享GL对象的访问权限。否则可能会出现种族条件和其他不良情况。