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

时间:2013-11-16 02:27:42

标签: macos opengl graphics 3d 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...
}

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

这是否记录在任何地方? (我已经浏览了opengl.org手册和wiki,但没有找到解释这种情况的任何内容。例如,http://www.opengl.org/wiki/OpenGL_Context表示纹理,缓冲区和程序对象是共享的,但对纹理单元没有任何说明。)

1 个答案:

答案 0 :(得分:7)

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

共享的内容:

  • 顶点缓冲区对象(一般为缓冲区对象)
  • 纹理对象
  • GLSL计划对象

共享的内容包括:

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

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

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

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