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

5

显然,一个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还是GL_TEXTURE0

这个问题有没有文档说明呢?(我已经搜遍了opengl.org的手册和维基百科,但没找到任何关于这种情况的说明。例如,http://www.opengl.org/wiki/OpenGL_Context中提到纹理、缓冲区和程序对象是共享的,但没有提到纹理单元。)

1个回答

9

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

可以共享的内容:

  • 顶点缓冲区对象(通用缓冲区对象)
  • 纹理对象
  • GLSL程序对象

不可共享的内容包括:

  • 一般状态机
  • 容器对象,例如:顶点数组对象和帧缓冲对象
    • 是的,尽管名字含有“buffer”,但FBOs不是缓冲区对象!

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

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

如果您从一个绑定了纹理A到单元0的上下文中发出绘图命令,则着色器将始终使用纹理A,每次从纹理单元0采样。如果您从一个绑定了纹理B到单元0的上下文中发出相同的绘图命令,那么着色器会采样纹理B。


明白了,谢谢。我想我的问题可能出在别的地方。(继续阅读:http://stackoverflow.com/q/20020181/64860。) - smokris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接