显然,OpenGL纹理单元的范围并不比单个进程宽 - 在同一系统上,每个进程可以glActiveTexture(GL_TEXTURE0); glBindTexture(...);
多个进程,并且工作正常 - 纹理不会在进程之间混淆。
但是,在单个流程中的共享 OpenGL 上下文中,纹理单元是独立的还是共享的?
换句话说,我可以期望这起作用吗?
// Create a base context and bind one texture to GL_TEXTURE0
CGLContextObj baseContext = createGLContext(NULL);
{
CGLContextObj cgl_ctx = baseContext;
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 1);
// ...render continuously...
}
// On a separate thread, create a context shared with baseContext and bind a _different_ texture to GL_TEXTURE0
{
CGLContextObj cgl_ctx = createGLContext(baseContext);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 2);
// ...render continuously...
}
。或者,在第二个上下文中,我应该使用 GL_TEXTURE1
?
这在任何地方都有记录吗? (我已经搜索了 opengl.org 手册页和wiki,但没有找到任何解释这种情况的内容。 例如,http://www.opengl.org/wiki/OpenGL_Context 说纹理、缓冲区和程序对象是共享的,但对纹理单元却只字未提。
实际上,上下文资源共享仅限于实际定义数据存储的对象,并且在大多数窗口系统实现中默认禁用。
共享的内容 :
- 顶点缓冲区对象(一般为缓冲区对象)
- 纹理对象
- GLSL 程序对象
未 共享的内容包括:
- 通用状态机
- 容器对象,如顶点数组对象和帧缓冲对象
- 是的,尽管有这个名字,FBO 不是缓冲区对象!
每个上下文都维护自己的状态机,在此示例中共享的唯一内容是纹理对象本身。也就是说,您可以使用相同的纹理名称(GLuint
ID)来引用上下文之间的纹理,但纹理单元状态对于每个上下文都是完全唯一的。
纹理绑定不会在上下文之间共享。
如果从纹理 A 绑定到单元 0 的一个上下文发出绘制命令,则着色器将在从纹理单元 0 采样时使用纹理 A。如果从纹理 B 绑定到单元 0 的上下文发出相同的绘制命令,则着色器将对纹理 B 进行采样。