В сложном приложении есть несколько способов справиться с состоянием OpenGL:
1) Наличие политики, в которой каждая функция или метод, изменяющий состояние OpenGL, должны установить его обратно в прежнее состояние, прежде чем они что-либо сделали
2) Каждая функция или метод устанавливает состояние так, как они хотят, чтобы оно ничего не предполагало о существующем состоянии
3) Вы отслеживаете состояние, а функции и методы могут проверять его локально и устанавливать только то, что им нужно
В случае 1, если кто-то забывает следовать политике, возникают ошибки, и их трудно отследить. Кроме того, получение текущего состояния может быть дорогостоящим для определенных битов состояния.
В случае 2 вы тратите время на установку состояния, которое вам может не понадобиться. Это обычно не так уж и плохо.
В случае 3 вы тратите много усилий и памяти, отслеживая состояние, которое уже поддерживает OpenGL. Это дорого и подвержено ошибкам.
Так что обычно я иду с # 2. Для меня это наименьший объем работы, и в большинстве случаев он демонстрирует достаточно хорошую производительность. Ваш пробег может отличаться.