GLSL: Почему const int array намного медленнее, чем обычный массив? - PullRequest
13 голосов
/ 01 декабря 2011

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

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

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

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

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


Обновление

На самом деле я сначала попытался использовать 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

1 Ответ

2 голосов
/ 05 января 2012

Это очень странно. Скорее всего, у вас проблемы с драйверами. Я запустил включенный код шейдера на моем Nvidia 540M под Windows, и позволил ему работать в цикле. В этом цикле я однажды вызвал шейдерную программу и измерил время (также я проверил с обратной связью преобразования, правильно ли работает шейдер). Большинство циклов заканчивались в течение 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]);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...