两个NSOpenGLContexts究竟分享了什么?
问题描述:
我想创建一个NSOpenGLContext,初始化我的渲染引擎,然后使用第一个上下文中的共享参数创建新的NSOpenGLContexts。这是行不通的,在我继续之前,上下文之间究竟分享了什么?该文档有点亮:两个NSOpenGLContexts究竟分享了什么?
共享上下文共享共享启动前后创建的所有纹理对象,显示列表,顶点程序,片段程序和缓冲区对象。对象的状态也是共享的,但不是其他上下文状态,例如当前颜色,纹理坐标设置,矩阵和照明设置,栅格化状态以及纹理环境设置。
当我创建我的第一个NSOpenGLContext,我初始化我的渲染引擎,这使得下列类型的呼叫:
- glGenTextures,glActiveTexture,glBindTexture
- glEnable
- glUseProgram,glGetAttribLocation,glGetUniformLocation
- glUniform1i,glUniform3f
- glGenVertexArraysAPPLE,glBindVertexArrayAP PLE,glBindBuffer
- glVertexAttribPointer,glEnableVertexAttribArray
其中大多数是出于三个类型的任务 - 创造顶点和着色器程序,存储参考ATTRIB和计划内统一的位置,创造顶点数组,并结合几纹理。
您希望所有这些项目能够在上下文中共享吗?
答
函数调用不通过上下文共享。只有对象。而且只有一些的对象。
一般来说,共享的对象是那些明显禁止在另一个上下文中重新创建的对象。要么是由于存储大量数据,要么是相对较长的设置时间。
如果你想有一个名单,以下对象共享:
- 显示列表
- 纹理
- Renderbuffers
- 缓冲区对象
- 着色器和程序
显着不共享的对象:
- 顶点数组的对象(即去其中的缓冲器的对象是共享的,但不是该对象本身)
- Framebuffer的对象(如VAOs,只有去在其中被共享的东西)
被共享的对象意味着它在整个上下文中保持所有状态。所以如果你从一个上下文中修改状态,你会在另一个上下文中看到它。但是,这也意味着如果您使用多个线程,则必须同步您对共享GL对象的访问。否则会出现竞赛状况和其他不良情况。