Em geral, ramificação em shaders não é uma boa ideia. Mas agora eu tenho um sombreador com uma condição constante em relação a toda a chamada de empate. Portanto, o ramo que é executado é sempre o mesmo para uma chamada de empate.
Esse tipo de ramificação é ainda mais caro do que ter vários sombreadores sem esses galhos e alternar entre eles?
performance
shader
nikitablack
fonte
fonte
Respostas:
No hardware moderno, se todas as chamadas em um grupo seguirem o mesmo caminho, o caminho não utilizado não será avaliado.
no pseudo código:
torna-se
Onde
anyInvocationARB
será verdadeiro se qualquer chamada do shader tiver true comocond
(da extensão opengl ARB_shader_group_vote ).Se cond é derivável apenas de uniformes, o driver pode otimizar e avaliar a condição antes de iniciar a renderização e substituir o if por um ir para a ramificação correta. O OpenGL possui um recurso chamado sub-rotinas uniformes que o torna explícito.
fonte