Какой из двух вариантов лучше во многом зависит от того, что делают эти шейдеры, насколько они различны и сколько атрибутов / униформ вы устанавливаете и как часто они меняются. Не существует единого правильного ответа для всех случаев.
Это сказало: имейте в виду, есть не только стоимость для изменения состояния, но также и стоимость времени выполнения шейдера, и это заплачено за вершину и за фрагмент. Поэтому держать шейдер на низком уровне - это всегда хорошая идея, а универсальный шейдер сложнее, чем специализированный.
Минимизировать изменение состояния. Если у вас есть объекты A, C, E, использующие Программу X, и B, D, F, использующие Программу Y, тогда, при прочих равных условиях, визуализируйте в порядке ACEBDF, а не ABCDEF.
Относительно последнего вопроса: программы сохраняют свое состояние и, следовательно, значения униформы в течение всего срока их действия, если вы не связываете их. Но формы для каждого состояния программы означают, что если у вас есть две формы с одинаковым именем и типом в разных программах, значения не будут перенесены из одной программы в другую.