Как создать несколько шейдеров фрагмента стоп-градиента?

Я пытаюсь создать шейдер OpenGL ES 2.0, который выводит несколько градиентов остановки вдоль одной оси. Он должен интерполировать между несколькими цветами в точках, определенных в процентах.

Я достиг этого, используя if шейдер фрагмента, например:

float y = gl_FragCoord.y;
float step1 = resolution.y * 0.20;
float step2 = resolution.y * 0.50;

if (y < step1) {
    color = white;
} else if (y < step2) {
    float x = smoothstep(step1, step2, y);
    color = mix(white, red, x);
} else {
    float x = smoothstep(step2, resolution.y, y);
    color = mix(red, green, x);
}

Говорят, что ветвление в флеш-шейдере может убить производительность. Есть ли какая-то хитрость, которая может использоваться для интерполирования между многими значениями без использования if s? Это действительно стоит (это очень субъективно, я знаю, но как эмпирическое правило)?

Чтобы проиллюстрировать мою проблему, полный источник (хотя и короткий) в этой ссылке GLSL Sandbox: http://glsl.heroku.com/e#8035.0

Ответ 1

Если вы хотите удалить ветки, вы можете сделать следующее (взято из Heroku);

color = mix(white, red, smoothstep(step1, step2, y));
color = mix(color, blue, smoothstep(step2, step3, y));
color = mix(color, green, smoothstep(step3, resolution.y, y));

Но я совсем не уверен, что это быстрее, чем если /elses или нет.