glBindImageTexture 和 glBindTexture 有什么区别?以及着色器中以下声明之间的区别是什么:
layout (binding = 0, rgba32f) uniform image2D img_input;
和
uniform sampler2D img_input;
glBindImageTexture 和 glBindTexture 有什么区别?以及着色器中以下声明之间的区别是什么:
layout (binding = 0, rgba32f) uniform image2D img_input;
和
uniform sampler2D img_input;
layout(binding = 0) uniform sampler2D img_input;
这声明了一个采样器,它从纹理对象中获取数据。0 的绑定(您可以在 GLSL 4.20 的着色器中设置)表示绑定到纹理图像单元 0(通过glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, ...);
)的 2D 纹理是将用于此采样器的纹理。
采样器使用整个纹理,包括所有 mipmap 级别和数组层。大多数纹理采样函数使用归一化的纹理坐标([0, 1] 映射到纹理的大小)。大多数纹理采样函数还尊重过滤属性和其他采样参数。
layout (binding = 0, rgba32f) uniform image2D img_input;
这声明了一个图像,它表示来自纹理的单个图像。纹理可以有多个图像:mipmap 级别、数组层等。当您使用 时glBindImageTexture
,您将绑定来自纹理的单个图像。
图像和采样器是完全分开的。他们有自己的一套绑定索引;将纹理绑定到和来自不同纹理的图像绑定到图像绑定 0 是完全有效的。GL_TEXTURE0
使用关联采样器的纹理函数将从绑定到的内容中读取GL_TEXTURE0
,而关联图像变量上的图像函数将从绑定到的图像中读取图片绑定 0.
图像访问忽略所有采样参数。图像访问函数总是使用整数纹素坐标。
采样器只能从纹理中读取数据;图像变量可以读取和/或写入数据,以及对它们执行原子操作。当然,从着色器写入数据需要特别小心,特别是当有人去读取该数据时。