Я пытаюсь понять текстуры, текстурные блоки и семплеры в OpenGL 4.5. Я прилагаю изображение того, что я пытаюсь понять. Я думаю в моем примере все правильно, а вот насчёт 1D Sampler справа со знаком вопроса не уверен.
Итак, я знаю, что OpenGL предлагает ряд текстурных блоков/точек привязки, где текстуры и сэмплеры могут быть связаны, чтобы они работали вместе.
Каждая из этих точек привязки может поддерживать одну из целей каждой текстуры (в моем случае я привязываю цели GL_TEXTURE_2D
и GL_TEXTURE_1D
к точке привязки 0
, а другую GL_TEXTURE_2D
к точке привязки 1
).
Кроме того, сэмплеры могут быть привязаны к этим точкам привязки почти таким же образом (я привязал 2D-сэмплер к точке привязки 0
на рисунке).
Функции для выполнения этих операций — glBindTextureUnit
и glBindSampler
.
Моей первоначальной мыслью было также привязать одномерный сэмплер к точке привязки 0, а в стране шейдеров выполнить сопоставление на основе точки привязки и типа сэмплера:
layout (binding = 0) uniform sampler1D tex1D;
layout (binding = 0) uniform sampler2D tex2D;
Цитирую источник:
Каждый блок изображения текстуры поддерживает привязки ко всем целям. Таким образом, 2D-текстура и текстура-массив могут быть связаны с одним и тем же элементом изображения, или разные 2D-текстуры могут быть связаны с двумя разными элементами изображения, не влияя друг на друга. Итак, какая текстура используется при рендеринге? В GLSL это зависит от типа сэмплера, который использует эту единицу изображения текстуры.
но я нашел следующее утверждение:
[..] звучит подозрительно, как будто вы можете использовать один и тот же блок изображения текстуры для разных сэмплеров, если они имеют разные типы текстур. Не делай это. Спецификация явно запрещает это; если два разных сэмплера GLSL имеют разные типы текстур, но связаны с одним и тем же блоком изображения текстуры, то рендеринг завершится ошибкой. Дайте каждому сэмплеру разные единицы изображения текстуры.
Итак, мой вопрос: какова цель привязки разных целей текстуры к одной и той же точке привязки, если в конечном итоге один сэмплер будет привязан к этой точке привязки, заставляя вас выбирать?
Информация, которую я цитирую: https://www.khronos.org/opengl/wiki/Texture#Texture_image_units