OpenGL glActiveTexture 与 glBindImageTexture

Jim*_*Jim 2 opengl

我是 OpenGL 新手,对这些功能感到困惑。我认为 glActiveTexture 激活纹理“槽”或类似的东西,并且您绑定的下一个纹理绑定到该槽。但现在我看到 glBindImageTexture (call:) glBindImageTexture(0, texHandle, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);,我看不出这个函数与 glActiveTexture 和 glTexImage2D 之间的区别。

实际上我什至不知道纹理和图像之间的区别,所以你能解释一下它们的区别吗?

Nic*_*las 7

glActiveTexture彼此glBindImageTexture无关。尽管它们的命名相似,但它们代表的是两种完全不同的事物。

glActiveTexture设置当前活动的“纹理图像单元”。

glBindImageTexture将纹理中的图像绑定到特定的“图像单元”。注意引文中的关键短语。“图像单元”用于着色器图像加载/存储操作。它们用于着色器采样器访问;这是为“纹理图像单元”保留的。是的,它们的名称相似,但它们不是同一件事。

图像加载/存储用于从着色器任意读取和(主要)写入图像数据。在 GLSL 中,这些是由uniform带有前缀imageimage2D例如 )的变量定义的。sampler常规纹理访问由前缀为(如)的统一变量处理sampler2D

采样器纹理访问允许您执行过滤、自动 mipmap 选择等操作。图像加载/存储不会。它只是从特定纹理内的特定图像读取内存。

要将纹理与采样器一起使用,请将纹理绑定到纹理图像单元(通常使用glActiveTexture/ glBindTexture)。要使用来自纹理的图像进行图像加载/存储,您可以使用glBindImageTexture. 纹理图像单元的集合与“图像单元”的集合没有任何关系。

两个功能都不能替代另一个,也没有任何冲突。“图像单元”的数量与“纹理图像单元”的数量无关。并且当前的“纹理图像单元”对 没有影响glBindImageTexture。或与“图像单位”有关的任何其他内容。