Оказалось, что Jaa-cs answere не подходит для меня, так как я нацеливаюсь на WebGL, который не допускает использование переменных в качестве индексов (если это не индекс цикла).Его решение может отлично работать для других реализаций OpenGL.
Я придумал это решение, используя функции mix и step:
//Outside of main function:
uniform vec3 constArray[5]; // Values are sent in to shader
//Inside main function:
float a = constArray[0];
a = mix(a, constArray[1], step(2.0, b));
a = mix(a, constArray[2], step(4.0, b));
a = mix(a, constArray[3], step(6.0, b));
a = mix(a, constArray[4], step(8.0, b));
Но после некоторого тестирования оно не дало видимой производительностиувеличение.Я наконец-то получил это решение:
float a = constArray[0];
if (b >= 2.0)
a = constArray[1];
if (b >= 4.0)
a = constArray[2];
if (b >= 6.0)
a = constArray[3];
if (b >= 8.0)
a = constArray[4];
, которое является одновременно компактным и легко читаемым.В моем случае обе эти альтернативы и мой исходный код работали одинаково, но, по крайней мере, вот несколько вариантов, которые можно попробовать.