Я хочу знать, действительно ли "операторы if" внутри шейдеров (вершина/фрагмент/пиксель...) действительно замедляют работу шейдера. Например:
Лучше использовать это:
vec3 output;
output = input*enable + input2*(1-enable);
вместо этого:
vec3 output;
if(enable == 1)
{
output = input;
}
else
{
output = input2;
}
на другом форуме был разговор об этом (2013): http://answers.unity3d.com/info/442688/shader-if-else-performance.html Здесь парни говорят, что операторы If действительно плохо влияют на производительность шейдера.
Также здесь они говорят о том, сколько внутри операторов if/else (2012): https://www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)
возможно, аппаратное обеспечение или шейдерный компилятор теперь лучше, и они как-то исправляют эту (возможно, не существующую) проблему с производительностью.
EDIT:
Что в данном случае, допустим, что enable - это единообразная переменная, и она всегда имеет значение 0:
if(enable == 1) //never happens
{
output = vec4(0,0,0,0);
}
else //always happens
{
output = calcPhong(normal, lightDir);
}
Я думаю, что здесь у нас есть ветвь внутри шейдера, которая замедляет шейдер. Это правильно?
Имеет ли смысл создавать 2 разных шейдера, например, один для другого и другой для части if?