В чем разница между glBindImageTexture() и glBindTexture()?
В чем разница между glBindImageTexture и glBindTexture? А также в чем разница между следующими объявлениями в шейдере:
layout (binding = 0, rgba32f) uniform image2D img_input;
а также
uniform sampler2D img_input;
1 ответ
layout(binding = 0) uniform sampler2D img_input;
Это объявляет сэмплер, который получает свои данные от объекта текстуры. Привязка 0 (вы можете установить это в шейдере в GLSL 4.20) говорит о том, что 2D текстура привязана к единице изображения текстуры 0 (через glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, ...);
) - это текстура, которая будет использоваться для этого сэмплера.
Сэмплеры используют всю текстуру, включая все уровни mipmap и слои массива. Большинство функций выборки текстуры используют нормализованные координаты текстуры ([0, 1] отображают размер текстуры). Большинство функций выборки текстуры также учитывают свойства фильтрации и другие параметры выборки.
layout (binding = 0, rgba32f) uniform image2D img_input;
Это объявляет изображение, которое представляет одно изображение из текстуры. Текстуры могут иметь несколько изображений: уровни mipmap, слои массивов и т. Д. При использовании glBindTextureImage
Вы связываете одно изображение из текстуры.
Изображения и сэмплеры полностью разделены. У них есть свой собственный набор обязательных индексов; совершенно правильно связать текстуру с GL_TEXTURE0
и изображение из текстуры, отличной от привязки изображения 0. Использование функций текстуры для связанного сэмплера будет считывать то, что связано с GL_TEXTURE0
в то время как функции изображения в соответствующей переменной изображения будут считываться с изображения, привязанного к привязке изображения 0.
Доступ к изображениям игнорирует все параметры выборки. Функции доступа к изображениям всегда используют целочисленные координаты текселя.
Сэмплеры могут только читать данные из текстур; Переменные изображения могут считывать и / или записывать данные, а также выполнять над ними атомарные операции. Конечно, запись данных из шейдеров требует особой осторожности, особенно когда кто-то идет читать эти данные.