As declarações If tornam meu shader mais lento?
Eu quero saber se as "declarações If" dentro dos shaders (vértice / fragmento / pixel ...) estão realmente diminuindo o desempenho do shader. Por exemplo:
É melhor usar isso:
vec3 output;
output = input*enable + input2*(1-enable);
em vez de usar isso:
vec3 output;
if(enable == 1)
{
output = input;
}
else
{
output = input2;
}
em outro fórum, houve uma conversa sobre isso (2013):http://answers.unity3d.com/questions/442688/shader-if-else-performance.html Aqui os caras estão dizendo que as declarações If são muito ruins para o desempenho do shader.
Também aqui eles estão falando sobre quanto está dentro das declarações if / else (2012):https://www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)
talvez o hardware ou o shadercompiler estejam melhores agora e solucionem de alguma forma esse problema de desempenho (talvez não existente).
EDITAR:
O que acontece neste caso, digamos que enable é uma variável uniforme e sempre é definida como 0:
if(enable == 1) //never happens
{
output = vec4(0,0,0,0);
}
else //always happens
{
output = calcPhong(normal, lightDir);
}
Acho que aqui temos um ramo dentro do shader que reduz a velocidade do shader. Isso está correto?
Faz mais sentido fazer 2 shaderes diferentes, como um para o outro e outro para a parte if?