Поскольку OpenGL является конечным автоматом, я постоянно использую glEnable () и glDisable () в своей программе. Есть несколько избранных вызовов, которые я делаю только в начале (например, glClearColor), но большинство других я включаю и выключаю (например, освещение, в зависимости от того, рендую ли я модель, или 3D-текст, или графический интерфейс).
Как вы отслеживаете состояние вещей? Вы постоянно устанавливаете / сбрасываете эти вещи в верхней части каждой функции? Разве это не много ненужных накладных расходов?
Например, когда я пишу новую функцию, иногда я знаю, в каком состоянии все будет, когда вызывается функция, и я пропускаю glEnable или glDisable или другие связанные вызовы переключения состояний в верхней части функции. В других случаях я просто пишу эту функцию заранее и добавляю подобные вещи. Таким образом, мои функции оказываются очень запутанными, некоторые из них изменяют состояние OpenGL, а другие просто делают предположения (которые позже нарушаются, а затем я должен вернуться и выяснить, почему что-то пожелтело или почему другое перевернуто и т. Д. ).
Как вы отслеживаете OpenGL между функциями в объектно-ориентированной среде?
С этим вопросом также связано, как узнать, когда использовать push и pop, а когда просто установить значение.
Например, допустим, у вас есть программа, которая рисует некоторые 3D-объекты, а затем рисует некоторые 2D-элементы. Очевидно, что проекционная матрица различна в каждом случае. Вы тоже:
- установить матрицу трехмерной проекции, нарисовать 3D, настроить матрицу двумерной проекции, нарисовать 2d, петля
- установить в программе матрицу трехмерного проецирования; затем нарисуйте 3d, нажмите матрицу, нарисуйте 2d, поп-матрицу, петлю
А почему?