2014-12-20 6 views
1

У меня есть фрагментный шейдер, который уменьшает цвета до 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? Какие эффективные альтернативы у меня есть?

ответ

2

GLSL ES 1.00 для OpenGL ES 2.0spec имеет следующую строку:

форменные (кроме пробников)

В вершинном шейдере, поддержку всех форм индексации массива мандатов. В шейдере фрагмента поддержка индексирования - это только , назначенная для константных-индексных выражений.

Большинство драйверов реализуют эту функциональность в флеш-шейдерах, но это не требуется, поэтому Tegra 4 имеет все права на отказ от вашего кода.

 Смежные вопросы

  • Нет связанных вопросов^_^