Проблема в используемых вами терминах.
Позвольте мне сделать подобие:
- Исполняемый файл состоит из связанных объектов , объектов скомпилированы из источника.
- Шейдерная программа состоит из связанных шейдерных объектов , шейдерные объекты компилируются из исходного кода.
Как видите, шейдерная программа - это исполняемый файл. Он связывает несколько шейдерных объектов. Каждый шейдерный объект компилируется из источника. Что касается обычного исполняемого файла, существует только одна основная точка входа, которая определяется только одним шейдерным объектом. Так же, как компиляция с любой цепочкой инструментов компиляции.
Решением является хороший баланс между комбинациями шейдерных объектов и количеством шейдерных программ. Конечно, было бы замечательно иметь только одну шейдерную программу для рендеринга, но это слишком притворно: попробуйте проанализировать функциональность шейдеров, а затем скомпилировать эти функции отдельно и связать при необходимости.
И вы должны взглянуть на Реестр OpenGL , я думаю, вы можете найти что-то интересное в списке расширений.