Является ли постоянное состояние более дорогостоящим, чем переключение шейдеров?

14

Вообще, ветвление в шейдерах не очень хорошая идея. Но теперь у меня есть шейдер с условием, которое является постоянным по отношению ко всему вызову отрисовки. Таким образом, выполняемая ветвь всегда одинакова для одного вызова отрисовки.

Является ли такой вид ветвления еще более дорогостоящим, чем использование нескольких шейдеров без этих ветвей и переключения между ними?

nikitablack
источник
Как объясняет ответ на мой вопрос, фрагменты группируются в «деформации» или «волновые фронты», и если все фрагменты в такой группе используют одну и ту же ветвь, выполняется только эта ветвь.
Мартин Эндер
Но как насчет шейдеров, отличных от фрагмента?
nikitablack
1
Я подозреваю, что это не дубликат, но его нужно отредактировать, чтобы было ясно, что спрашивают, прежде чем это можно будет определить. Некоторый пример кода или объяснение двух сравниваемых вариантов очень помогло бы.
Трихоплакс,

Ответы:

13

На современном оборудовании, если все вызовы в группе идут по одному и тому же пути, неиспользуемый путь не оценивается.

в псевдокоде:

if(cond){
   res = ...
}else{
   res = ...
}

становится

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

Где anyInvocationARBбудет истина, если любой вызов шейдера будет иметь истину как cond(из расширения opengl ARB_shader_group_vote ).

Если cond выводится только из униформ, то драйвер может оптимизировать и оценить условие перед началом рендеринга и заменить if на переход к правильной ветви. OpenGL имеет функцию, называемую унифицированными подпрограммами, которая делает ее явной.

чокнутый урод
источник
4
Это правда, но это не единственное, что вам нужно учитывать для производительности. Графические процессоры по-прежнему статически планируют ресурсы для каждого шейдера, так что это может по-прежнему использовать ресурсы, как если бы вы выполняли обе ветви, что может повредить заполнению.
Джон Калсбек