Подтвердить что ты не робот

GLSL: Почему массив const int намного медленнее, чем обычный массив?

У меня есть шейдер OpenGL, написанный в glsl. У меня есть глобально определенный массив в верхней части заголовка, например:

const int permutations[256] = int[256](
    64 ,  34 ,  36 , 137 , 120 , 122 , 246 ,  46 ,  79 ,  10 ,  37 , 181,
    ...
    );

Когда я запускаю программу, она чрезвычайно медленная, то есть я имею только 1 кадр в секунду при отображении простого чайника с использованием шейдера.

Однако, как только я удаляю "const" из вышеуказанного объявления, все работает нормально, и я возвращаюсь к интерактивным частотам кадров.

Итак, "проблема" на самом деле уже решена... но мне было интересно, почему это может быть так? Очень противоречиво, как и в моем опыте, использование consts обычно делает программы быстрее.


Update

Я на самом деле попытался использовать Uniform сначала вместо массива const int с точно таким же кодом везде. Однако в этом случае компиляция шейдеров завершается с:

Internal error: assembly compile error for fragment shader at offset
34609:
-- error message -- line 651, column 22:  error: invalid local parameter number
4b9b3361

Ответ 1

Это очень странно. Скорее всего, у вас проблемы с драйвером. Я запускал включенный шейдерный код на моем Nvidia 540M под окнами и позволял ему работать в цикле. В этом цикле я называл шейдерную программу раз и измерял время (также я проверил с обратной связью преобразования, если шейдер работает правильно). Большинство циклов заканчивалось 2-3 миллисекундами, а некоторые пики составляли 25 мс. Однако удаление идентификатора const не повлияло на производительность. Это довольно маленькие значения для измерения, но из вашего описания поражение производительности const должно наблюдаться даже здесь.

#version 150
const int permutations[256] = int[256](
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
...
246, 247, 248, 249, 250, 251, 252, 253, 254, 255
);

flat out int num1[32];

void main(){
    for(int i = 0; i < 32; i++){
        num1[i] = (permutations[2*i]+permutations[2*i+1])*(permutations[2*i+2]+permutations[2*i+3]);
    }
}

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