layout(binding = 0) uniform sampler2D img_input;
Это объявляет sampler, который получает данные из объекта текстуры. Связывание 0 (вы можете установить это в шейдере в GLSL 4.20) говорит о том, что текстура 2D, связанная с блоком изображения текстуры 0 (через glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_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
и изображения от другой текстуры к привязке изображения 0. Использование функций текстуры для связанного сэмплера будет считываться с того, что связано с GL_TEXTURE0
, тогда как функции изображения на связанной переменной изображения будут считываться с изображения связанный с привязкой изображения 0.
Доступ к изображениям игнорирует все параметры выборки. Image accessing functions всегда используют целочисленные тексельные координаты.
Пробоотборники могут считывать данные только из текстур; переменные изображения могут читать и/или записывать данные, а также выполнять атомарные операции над ними. Конечно, запись данных из шейдеров требует особого внимания, особенно когда someone goes to read that data.