Указание привязки для массивов текстур в glsl - PullRequest
1 голос
/ 26 мая 2020

В glsl 420 была добавлена ​​функциональность для указания привязки в шейдере вместо вызова glUniform1i. Например:

layout(binding = 0) uniform sampler2D u_Texture;

Но как это можно сделать для массивов?

layout(binding ?) uniform sampler2D u_Textures[16];

Я хочу, чтобы привязки были 0,1,2, ..., 15. Я не могу сделать это в glsl без каких-либо вызовов glUniform?

1 Ответ

1 голос
/ 27 мая 2020

См. Спецификация OpenGL Shading Language 4.60 - 4.4.5. Квалификаторы компоновки блока Uniform и Shader Storage :

При использовании с OpenGL, если квалификатор привязки используется с равномерным блоком или блоком хранения шейдера, созданным как массив, первый элемент массива принимает указанную привязку блока, а каждый последующий элемент занимает следующую последовательную точку привязки .

Это означает, что вам просто нужно указать точку привязки первого сэмплера в массиве:

layout(binding = 0) uniform sampler2D u_Textures[16];

Но обратите внимание, когда сэмплеры объединяются в массивы внутри шейдера , эти типы могут быть проиндексированы только с помощью динамически унифицированного выражения , иначе поиск текстуры приведет к неопределенным значениям.

Я рекомендую использовать sampler2DArray (см. Sampler ) вместо массива sampler2D.

См. Также:
Почему Uniform-переменные не работают в GLSL?
Почему в фрагментном шейдере нельзя использовать плоское входное целое число для индексации однородного массива sampler2D?

...