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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 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];