OpenGL glActiveTexture vs glBindImageTexture

时间:2016-03-01 06:40:10

标签: opengl

我是OpenGL的新手,我对这些功能感到困惑。 我认为glActiveTexture会激活一个纹理" slot"或者......那样的, 你绑定的下一个texuture绑定到这个插槽。 但现在我看到了glBindImageTexture(调用:glBindImageTexture(0, texHandle, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);),我看不出这个函数与glActiveTexture和glTexImage2D之间的区别。

实际上我甚至不知道纹理和图像之间的区别,你能解释一下这些差异吗?

2 个答案:

答案 0 :(得分:3)

将纹理单位(glActiveTexture选择的单位)视为墨盒的插槽。实际上,glBindTexture将盒式磁带插入使用glActiveTexture选择的插槽中。

glTexImage2D是加载" paint"进入实际的墨盒。并且具有多重纹理功能的GPU(所有现代GPU都具有多重纹理功能)可以同时使用填充不同图像的多个墨盒(纹理)(使用glTexImage),其中每个墨盒都设置在纹理单元中。一个有趣的事情是,同一个墨盒可以同时插入多个单元。

由于评论而更新

从非常粗略的意义上讲,您可能会想到以这种方式流动的图像数据。

Files

答案 1 :(得分:3)

glActiveTextureglBindImageTexture 彼此无关。尽管它们的命名有相似之处,但它们完全不同。

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

glBindImageTexture将图像从纹理绑定到特定的“图像单元”。请注意引号中的关键短语。 “图像单元”用于着色器image load/store operations。它们用于shader sampler accesses;这是为“纹理图像单元保留的”。是的,他们的名字相似,但他们不是一回事。

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

采样器纹理访问允许您执行filtering,自动mipmap选择等操作。图像加载/存储没有。它只是从特定纹理中的特定图像中读取内存。

要将纹理与采样器一起使用,可以将纹理绑定到纹理图像单元(通常使用glActiveTexture / glBindTexture)。要使用带有图像加载/存储的纹理中的图像,请使用glBindImageTexture。纹理图像单元集与“图像单元”集无关。

这两种功能都不会取代另一种功能,也不存在任何冲突。 “图像单元”的数量与“纹理图像单元”的数量无关。并且当前的“纹理图像单元”对glBindImageTexture没有影响。或与“图像单位”有关的任何其他事项。