2012-02-29 68 views
4

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

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

当我创建我的第一个NSOpenGLContext,我初始化我的渲染引擎,这使得下列类型的呼叫:

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

其中大多数是出于三个类型的任务 - 创造顶点和着色器程序,存储参考ATTRIB和计划内统一的位置,创造顶点数组,并结合几纹理。

您希望所有这些项目能够在上下文中共享吗?

回答

4

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

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

如果你想有一个名单,以下对象共享:

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

显着不共享的对象:

  • 顶点数组的对象(即去其中的缓冲器的对象是共享的,但不是该对象本身)
  • Framebuffer的对象(如VAOs,只有去在其中被共享的东西)

被共享的对象意味着它在整个上下文中保持所有状态。所以如果你从一个上下文中修改状态,你会在另一个上下文中看到它。但是,这也意味着如果您使用多个线程,则必须同步您对共享GL对象的访问。否则会出现竞赛状况和其他不良情况。