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

smo*_*ris 4 opengl 3d macos graphics core-graphics

显然,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...
}
Run Code Online (Sandbox Code Playgroud)

......或者,在第二种情况下,我应该使用GL_TEXTURE1吗?

这记录在哪里?(我已经浏览了opengl.org手册和wiki,但没有找到解释这个场景的任何内容.例如,http://www.opengl.org/wiki/OpenGL_Context说纹理,缓冲区和程序对象是分享,但没有说明纹理单位.)

And*_*man 7

有效地,上下文资源共享仅限于实际定义数据存储的对象,并且在大多数窗口系统实现中默认禁用.

事情正在共享:

  • 顶点缓冲区对象(一般缓冲区对象)
  • 纹理对象
  • GLSL程序对象

这件事情共享包括:

  • 一般状态机
  • 容器对象,如"顶点数组对象"和"帧缓冲对象"
    • 是的,尽管名称,FBO不是缓冲对象!

每个上下文都维护着自己的状态机,在这个例子中你唯一分享的就是纹理对象本身.也就是说,您可以使用相同的纹理名称(GLuintID)来引用上下文之间的纹理,但纹理单元状态对于每个上下文都是完全唯一的.

纹理绑定不在上下文之间共享.

如果从纹理A绑定到单元0的一个上下文发出绘制命令,则着色器将在纹理单元0中采样时使用纹理A.如果从纹理B绑定到单元0的上下文中发出相同的绘制命令,然后着色器将采样纹理B.