В фрагментном шейдере, почему я не могу использовать плоское входное целое число для индексации равномерного массива sampler2D? - PullRequest
0 голосов
/ 27 января 2019

плохо знакомы с шейдерами и немного озадачены.

Я хочу указать текстуры, которые будут использоваться при рендеринге массива спрайтов.Поэтому я помещаю текстурный индекс в их данные вершин и передаю его как плоское значение из моего вершинного шейдера в мой фрагментный шейдер, но не могу использовать его для индексации массива сэмплеров, как ожидалось, потому что компилятор видит его как «непостоянный»».Вместо этого я должен прибегнуть к отвратительному коду ниже.Кто-нибудь может объяснить, что здесь происходит?

const int numTextures = 2;

uniform sampler2D textures[numTextures];

in vec2 uv;
flat in int tex;
out vec4 colour;

void main(void)
{
    // this caused the compiler error 
        /// "sampler arrays indexed with non-constant expressions"
    // colour = texture( textures[ tex ], uv );

    // hence this (ugh) ...
    switch ( tex ) 
    {
        case 0:
            colour = texture( textures[0], uv );
            break;
        case 1:
            colour = texture( textures[1], uv );
            break;
        default:
            colour = vec4( 0.3f, 0.3f, 0.3f, 1.0f );
            break;
    };
} 

1 Ответ

0 голосов
/ 27 января 2019

[...], но не может использовать его для индексации массива сэмплеров, как ожидалось, потому что компилятор видит его как "непостоянный" [...]

InGLSL до версии 3.30 и соответственно GLSL ES до версии 3.00 индекс массива сэмплеров должен быть постоянным выражением:

GLSL 3.30 Спецификация - 4.1.7 Сэмплеры (стр. 21)
GLSL ES 3.00 Спецификация - 4.1.7.1 Сэмплеры (стр. 29) :

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


В более поздней версии индекс для массива сэмплеров должен быть "динамически однородным".Это означает, что индекс должен быть «одинаковым» для всех фрагментов (например, константа или равномерная переменная).

GLSL 4.60 Спецификация - 4.1.11.Непрозрачные типы (стр. 31)
GLSL ES 3.20 Спецификация - 4.1.11.Непрозрачные типы (стр. 32)

При объединении в массивы в шейдере непрозрачные типы могут индексироваться только с помощью динамически однородного интегрального выражения.[...]

[...] Типы сэмплеров (например, sampler2D ) являются непрозрачными типами [...]

GLSL 4.60Спецификация - 3.8.2.Динамически однородные выражения (стр. 20)
GLSL ES 3.20 Спецификация - 3.9.3.Динамически однородные выражения (стр. 22)

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

...