glBindImageTexture()和glBindTexture()有什么区别?

时间:2016-05-10 11:09:18

标签: opengl texture2d glteximage2d

glBindImageTexture和glBindTexture有什么区别?并且着色器中的以下声明之间的区别是什么:

layout (binding = 0, rgba32f) uniform image2D img_input;

uniform sampler2D img_input;

1 个答案:

答案 0 :(得分:13)

layout(binding = 0) uniform sampler2D img_input;

声明了sampler,它从纹理对象获取数据。绑定0(您可以在GLSL 4.20中的着色器中设置)表示绑定到纹理图像单元0(通过glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, ...);)的2D纹理是将用于此采样器的纹理。

采样器使用整个纹理,包括所有mipmap级别和数组层。大多数纹理采样函数使用标准化纹理坐标([0,1]映射到纹理的大小)。大多数纹理采样函数也尊重filtering properties and other sampling parameters

layout (binding = 0, rgba32f) uniform image2D img_input;

这声明了一个图像,它表示纹理中的单个图像。纹理可以have multiple images:mipmap级别,array layers等。当您使用glBindTextureImage时,您将绑定纹理中的单个图像。

图像和采样器完全分开。他们有自己的约束指数;将纹理绑定到GL_TEXTURE0并将图像从不同的纹理绑定到图像绑定是完全有效的。使用相关采样器的纹理函数将从绑定到GL_TEXTURE0的内容读取,而图像函数则在相关图像变量将从绑定到图像绑定0的图像中读取。

图像访问忽略所有采样参数。 Image accessing functions始终使用整数纹理坐标。

采样器只能从纹理中读取数据;图像变量可以读取和/或写入数据,也可以对它们执行原子操作。当然,从着色器编写数据需要特别小心,特别是在someone goes to read that data时。