Такие филиалы, как правило, не дорогие.Они обычно реализуются с использованием предикации.Таким образом, графический процессор вычисляет обе ветви, но только фактически сохраняет результаты инструкций, где условие предикации является истинным.Следовательно, инструкция перехода не используется.Вот как может выглядеть код ассемблера:
cmp_eq p0, r0, 0.0 // predicate = (value == 0.0)
(p0) mov r1, 0.0 // other_value = 0.0, if predicate true
(!p0) rcp r1, r0 // other_value = 1.0 / value, if predicate false
Обратите внимание, что в этом случае вторая инструкция фактически не должна быть предикатом.В любом случае, как указано другими, результат деления (обратный) не определен, когда знаменатель равен нулю.Но, как вы можете видеть, вы сможете получить четко определенное поведение за счет пары дешевых инструкций (деление обычно медленное).Насколько мне известно, все графические процессоры, которые поддерживают настоящие ветви (инструкции перехода), также поддерживают предикацию.Компилятор шейдера оценит, использовать ли предикацию или переход, и обычно будет делать правильные вещи.
Конечно, если вы действительно не заботитесь о результате деления на ноль, тогда вы можете сохранить любойвся стоимость предикации.