Это почти зависит от того, что вы имеете в виду.
Ветвление в шейдерной программе влияет на производительность в терминах GPU: если ваши массивы вершин очень длинные, я бы избегал ветвления;вместо этого используйте препроцессор и связывайте несколько разных программ.
Наличие одной шейдерной программы огромного размера повышает производительность процессора: каждая glUseProgram требует времени, и вы можете вызвать ее только один раз(хотя бы меньше).
Преимущества ЦП больше преимуществ ГП?Отвечая на этот вопрос, ответьте на ваш вопрос.
...
Лично я использую препроцессор и избегаю разветвлений в фундаментальных целях.Каждая шейдерная программа имеет четко определенные интерфейсы, и различные объекты реализуют их;присоединение различных объектов завершает реализацию программы.
Реализация директивы #include очень помогает.Общие объявления включены в различные объекты, и только статически доступные атрибуты и униформы эффективно связаны с программой.
Это пример моей шейдерной программы:
#include </Derm/Shaders/IProjectVertex>
#include </Derm/Shaders/Compatibility>
#include </Derm/Shaders/Standard/ShaderInputs>
#include </Derm/Shaders/Standard/IColorVertex>
// --- Vertex shader outputs
// This shader output interface
BEGIN_OUTPUT_BLOCK(FragmentShaderVaryings)
// Processed vertex color
vec4 ds_Color;
// Processed vertex texture coordinate
END_OUTPUT_BLOCK()
// Vertex shader entry point
void main()
{
// Compute transformed vertex position
gl_Position = ProjectVertexPosition(ds_VertexPosition);
#if defined(DS_COLOR_PER_VERTEX)
// Support vertex color
ds_Color = ComputeVertexColor();
#endif
// Support vertex texturing
#if defined(DS_TEXTURE)
ds_TexCoords = ds_VertexTexCoord;
#endif
}