Вообще, ветвление в шейдерах не очень хорошая идея. Но теперь у меня есть шейдер с условием, которое является постоянным по отношению ко всему вызову отрисовки. Таким образом, выполняемая ветвь всегда одинакова для одного вызова отрисовки.
Является ли такой вид ветвления еще более дорогостоящим, чем использование нескольких шейдеров без этих ветвей и переключения между ними?
performance
shader
nikitablack
источник
источник
Ответы:
На современном оборудовании, если все вызовы в группе идут по одному и тому же пути, неиспользуемый путь не оценивается.
в псевдокоде:
становится
Где
anyInvocationARB
будет истина, если любой вызов шейдера будет иметь истину какcond
(из расширения opengl ARB_shader_group_vote ).Если cond выводится только из униформ, то драйвер может оптимизировать и оценить условие перед началом рендеринга и заменить if на переход к правильной ветви. OpenGL имеет функцию, называемую унифицированными подпрограммами, которая делает ее явной.
источник