4

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

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

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

  • glGenTextures、glActiveTexture、glBindTexture
  • gl启用
  • glUseProgram、glGetAttribLocation、glGetUniformLocation
  • glUniform1i, glUniform3f
  • glGenVertexArraysAPPLE、glBindVertexArrayAPPLE、glBindBuffer
  • glVertexAttribPointer, glEnableVertexAttribArray

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

您是否希望所有这些项目都可以跨上下文共享?

4

1 回答 1

4

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

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

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

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

未共享的值得注意的对象:

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

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

于 2012-02-29T09:09:09.407 回答