mar*_*erg 10 opengl texture2d glteximage2d
glBindImageTexture和glBindTexture有什么区别?并且着色器中的以下声明之间的区别是什么:
layout (binding = 0, rgba32f) uniform image2D img_input;
Run Code Online (Sandbox Code Playgroud)
和
uniform sampler2D img_input;
Run Code Online (Sandbox Code Playgroud)
Nic*_*las 14
Run Code Online (Sandbox Code Playgroud)layout(binding = 0) uniform sampler2D img_input;
它声明了一个采样器,它从纹理对象获取数据.绑定0(您可以在GLSL 4.20中的着色器中设置)表示绑定到纹理图像单元0(via glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, ...);)的2D纹理是将用于此采样器的纹理.
采样器使用整个纹理,包括所有mipmap级别和数组层.大多数纹理采样函数使用标准化纹理坐标([0,1]映射到纹理的大小).大多数纹理采样函数也遵循滤波属性和其他采样参数.
Run Code Online (Sandbox Code Playgroud)layout (binding = 0, rgba32f) uniform image2D img_input;
这声明了一个图像,它表示纹理中的单个图像.纹理可以有多个图像:mipmap级别,数组图层等.使用时glBindTextureImage,您将绑定纹理中的单个图像.
图像和采样器完全分开.他们有自己的约束指数; 将纹理绑定到GL_TEXTURE0不同纹理和图像绑定的图像是完全有效的.使用相关采样器的纹理函数将从绑定的内容中读取GL_TEXTURE0,而关联图像变量上的图像函数将从绑定到的图像中读取图像绑定0.
图像访问忽略所有采样参数.图像访问功能始终使用整数纹理坐标.
采样器只能从纹理中读取数据; 图像变量可以读取和/或写入数据,也可以对它们执行原子操作.当然,从着色器写入数据需要特别小心,特别是当有人去读取数据时.