OpenGL 纹理单元的范围是什么?



显然,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 进行采样。

最新更新