В чем разница между 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-уровнями, слои массива, etc. Когда вы используете glBindTextureImage, вы связываете одно изображение с текстурой.

изображения и образцы полностью отделены. У них есть свой собственный набор индексов привязки; это совершенно справедливо для привязки текстуры к GL_TEXTURE0 и изображение из другой текстуры для привязки изображения 0. Использование текстурных функций для связанного сэмплера будет считываться из того, что связано с GL_TEXTURE0, в то время как функции изображения на связанной переменной изображения будут считываться из изображения, связанного с привязкой изображения 0.

Image access игнорирует все параметры выборки. функции доступа к изображению всегда использовать число тексель координаты.

сэмплеры могут считывать данные только из текстур; переменные изображения могут считывать и/или записывать данные, а также выполнять атомарные операции над ними. Конечно, запись данных из шейдеров требует особой осторожности, особенно когда кто-то идет читать эти данные.