У меня есть фрагментный шейдер, который уменьшает цвета до 4 разных цветов. Чтобы сделать это, я вычислить индекс, основанный на цвете, который изменяется от 0 до 3. Затем я LookUp значение конечного цвета в однородном массиве vec4:Значение чтения шейдерного фрагмента в равномерном массиве в OpenGL ES 2.0
В декларации массива:
uniform vec4 u_colors[4];
Поиск:
gl_FragColor = u_colors[int(index)];
Это хорошо работает на некоторых устройствах, но на некоторых устройствах (например на Tegra 4), кажется, я не могу получить доступ к массиву с переменным, а выход мусор , Единственная работа вокруг, что я нашел это:
index = floor(index);
if (index < 2.0) {
if (index == 0.0) {
gl_FragColor = u_colors[0];
} else {
gl_FragColor = u_colors[1];
}
} else {
if (index == 2.0) {
gl_FragColor = u_colors[2];
} else {
gl_FragColor = u_colors[3];
}
}
Это работает, и удивительно, что производительность все еще довольно хорошо, но это, очевидно, не является идеальным.
Я делаю что-то неправильно или это ошибка в драйвере/компиляторе GPU? Какие эффективные альтернативы у меня есть?