Индекс массива переменных невозможен в шейдерах webgl?

#glsl #webgl

#glsl #webgl

Вопрос:

Как следует из названия, я не могу сделать vector_array[foo] (при условии, что foo находится в диапазоне и является целым числом) в вершинных шейдерах webgl, правильно?

Являются ли текстуры лучшей альтернативой, или есть обходной путь или какой-то лучший способ имитировать таблицу поиска?

Ответ №1:

http://www.khronos.org/registry/webgl/specs/latest/#DYNAMIC_INDEXING_OF_ARRAYS «WebGL допускает динамическое индексирование только с помощью постоянных выражений, индексов цикла или их комбинации. Единственное исключение касается единообразного доступа в вершинных шейдерах, которые могут быть проиндексированы с использованием любого выражения.»

Вы пробовали это? Если это не сработало, есть пара вариантов.

Если у вас небольшое количество значений, if-else может работать нормально. AFAIK, единообразные значения все равно будут загружены в регистры, поэтому выполнение дюжины циклов математики над ними не сделает ваш шейдер намного медленнее.

Для большого количества значений лучше всего использовать текстуры.

Комментарии:

1. Есть обходной путь: /* given variable i is the index */ for (int x = 0; x < MAX_VALUE_FOR_INDEX; x ) { if (x == i) { /* use variable x as index here */ }}

Ответ №2:

Я не тестировал это, но я не получаю никакой ошибки компиляции из следующего

 //index as a float
attribute lowp float vColorIndex;
//the array
uniform vec4 Colors[16];

//type cast the float in an int
int index = int(vColorIndex);
//use index
vec4 col = Colors[index];
  

Комментарии:

1. Сбой во время выполнения.