Мы знаем, что if в шейдере - плохо. На самом деле бывает плохо, а бывает и нормально. Тут зависит от условия и что мы в нем делаем. Но я предпочитаю не полагаться на компилятор, а просто не использовать if-конструкции.
Давайте разберем простой пример:
half4 color = ...; if (color.a < _Threshold) { color = float4(1, 0, 0, 1); }
Если альфа у нас меньше чем какое-то значение, то закрасим красным цветом, если больше - оставим цвет как был.
Реальный код может быть сложнее, могут быть вложенные if-конструкции и т.д.
По сути это не важно, т.к. решение будет схожим. Для простоты заменим результат работы условия на XXX, т.к. нам не важно что там будет - функция, еще одно условие или какие-то другие хитрые вычисления:
if (color.a < _Threshold) { color = XXX; }
Теперь разберемся с условием, давайте перенесем все в одну сторону:
color.a - _Threshold < 0
Теперь наша задача записать все в одну строку:
color = lerp(XXX, color, color.a - _Threshold);
Т.е. мы возьмем XXX, если значение будет ноль и оставим color, если значение будет единица.
Теперь нам нужно избавиться от этой "плавности", одним из способов это сделать - добавить 0.5 и выполнить round (можно еще +0.5 и floor):
color = lerp(XXX, color, round((color.a - _Threshold) + 0.5));
Таким образом мы избавились от условия, чего и добивались :)