#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. Сбой во время выполнения.