¿Las declaraciones If ralentizan mi sombreador?
Quiero saber si las "declaraciones If" dentro de los sombreadores (vértice / fragmento / píxel ...) realmente están ralentizando el rendimiento del sombreador. Por ejemplo:
¿Es mejor usar esto?
vec3 output;
output = input*enable + input2*(1-enable);
en lugar de usar esto:
vec3 output;
if(enable == 1)
{
output = input;
}
else
{
output = input2;
}
en otro foro se habló sobre eso (2013):http://answers.unity3d.com/questions/442688/shader-if-else-performance.html Aquí los muchachos dicen que las declaraciones If son realmente malas para el rendimiento del sombreador.
También aquí están hablando de cuánto hay dentro de las declaraciones if / else (2012):https://www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)
tal vez el hardware o el shadercompiler son mejores ahora y solucionan de alguna manera este problema de rendimiento (tal vez no existente).
EDITAR:
En este caso, digamos que enable es una variable uniforme y siempre se establece en 0:
if(enable == 1) //never happens
{
output = vec4(0,0,0,0);
}
else //always happens
{
output = calcPhong(normal, lightDir);
}
Creo que aquí tenemos una rama dentro del sombreador que ralentiza el sombreador. ¿Es eso correcto?
¿Tiene más sentido hacer 2 sombreadores diferentes como uno para el otro y el otro para la parte if?