我是OpenGL的新手,我对这些功能感到困惑。
我认为glActiveTexture会激活一个纹理" slot"或者......那样的,
你绑定的下一个texuture绑定到这个插槽。
但现在我看到了glBindImageTexture(调用:glBindImageTexture(0, texHandle, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);
),我看不出这个函数与glActiveTexture和glTexImage2D之间的区别。
实际上我甚至不知道纹理和图像之间的区别,你能解释一下这些差异吗?
答案 0 :(得分:3)
将纹理单位(glActiveTexture选择的单位)视为墨盒的插槽。实际上,glBindTexture将盒式磁带插入使用glActiveTexture选择的插槽中。
glTexImage2D是加载" paint"进入实际的墨盒。并且具有多重纹理功能的GPU(所有现代GPU都具有多重纹理功能)可以同时使用填充不同图像的多个墨盒(纹理)(使用glTexImage),其中每个墨盒都设置在纹理单元中。一个有趣的事情是,同一个墨盒可以同时插入多个单元。
答案 1 :(得分:3)
glActiveTexture
和glBindImageTexture
彼此无关。尽管它们的命名有相似之处,但它们完全不同。
glActiveTexture
设置当前活动的“纹理图像单元”。
glBindImageTexture
将图像从纹理绑定到特定的“图像单元”。请注意引号中的关键短语。 “图像单元”用于着色器image load/store operations。它们不用于shader sampler accesses;这是为“纹理图像单元保留的”。是的,他们的名字相似,但他们不是一回事。
图像加载/存储用于任意读取和(主要)写入来自着色器的图像数据。在GLSL中,这些由uniform
变量定义,前缀为image
(例如image2D
)。常规纹理访问由前缀为sampler
的统一变量处理(如sampler2D
)。
采样器纹理访问允许您执行filtering,自动mipmap选择等操作。图像加载/存储没有。它只是从特定纹理中的特定图像中读取内存。
要将纹理与采样器一起使用,可以将纹理绑定到纹理图像单元(通常使用glActiveTexture
/ glBindTexture
)。要使用带有图像加载/存储的纹理中的图像,请使用glBindImageTexture
。纹理图像单元集与“图像单元”集无关。
这两种功能都不会取代另一种功能,也不存在任何冲突。 “图像单元”的数量与“纹理图像单元”的数量无关。并且当前的“纹理图像单元”对glBindImageTexture
没有影响。或与“图像单位”有关的任何其他事项。