Почему вы ждете до конца вашего приложения, чтобы удалить ваши шейдерные объекты? Вы должны были избавиться от них после того, как связали программы для них. Просто прикрепите их к программе, свяжите их, отсоедините и удалите (если вы не используете повторно шейдерные объекты).
Как только вы больше не носите с собой багаж шейдерных объектов, все просто. Просто удалите программы.
Или нет. Тебе решать; контекст OpenGL будет очищаться после себя. Но если вы хотите удалить их, то удалите их.
Если у вас есть их в 50 различных переменных, в которых хранятся программы, и вы не хотите набирать glDeleteProgram
50 раз, тогда совершенно очевидно, что ваш код плохо структурирован по размеру. Если у вас есть такое количество программ, вам необходимо приобрести систему управления ресурсами, где вы можете управлять ресурсами (например, загруженными программами) и обеспечивать их уничтожение. И под «заготовкой» я подразумеваю «написать».
Менеджеры ресурсов - это, по сути, блоки, в которые вы помещаете именованные объекты и получаете их. Когда менеджер ресурсов уничтожается, все ресурсы, которыми он управляет, также уничтожаются (обратите внимание: существуют способы сделать менеджер ресурсов, который может иметь альтернативные способы уничтожения вещей).