Как отслеживать состояние OpenGL при вызове функций? - PullRequest
8 голосов
/ 07 августа 2009

Поскольку OpenGL является конечным автоматом, я постоянно использую glEnable () и glDisable () в своей программе. Есть несколько избранных вызовов, которые я делаю только в начале (например, glClearColor), но большинство других я включаю и выключаю (например, освещение, в зависимости от того, рендую ли я модель, или 3D-текст, или графический интерфейс).

Как вы отслеживаете состояние вещей? Вы постоянно устанавливаете / сбрасываете эти вещи в верхней части каждой функции? Разве это не много ненужных накладных расходов?

Например, когда я пишу новую функцию, иногда я знаю, в каком состоянии все будет, когда вызывается функция, и я пропускаю glEnable или glDisable или другие связанные вызовы переключения состояний в верхней части функции. В других случаях я просто пишу эту функцию заранее и добавляю подобные вещи. Таким образом, мои функции оказываются очень запутанными, некоторые из них изменяют состояние OpenGL, а другие просто делают предположения (которые позже нарушаются, а затем я должен вернуться и выяснить, почему что-то пожелтело или почему другое перевернуто и т. Д. ).

Как вы отслеживаете OpenGL между функциями в объектно-ориентированной среде?


С этим вопросом также связано, как узнать, когда использовать push и pop, а когда просто установить значение.

Например, допустим, у вас есть программа, которая рисует некоторые 3D-объекты, а затем рисует некоторые 2D-элементы. Очевидно, что проекционная матрица различна в каждом случае. Вы тоже:

  1. установить матрицу трехмерной проекции, нарисовать 3D, настроить матрицу двумерной проекции, нарисовать 2d, петля
  2. установить в программе матрицу трехмерного проецирования; затем нарисуйте 3d, нажмите матрицу, нарисуйте 2d, поп-матрицу, петлю

А почему?

Ответы [ 3 ]

2 голосов
/ 07 августа 2009

Возможно, вам будет интересно узнать больше о библиотеках графа сцены. Они предназначены для управления вашей графикой на более высоком уровне. Они не справляются со всем хорошо, но они превосходно организовывают вашу геометрию для оптимизированного рендеринга. Они могут также использоваться для сортировки ваших сцен на основе состояния OpenGL, хотя многие этого не делают. Сортируя по состоянию, вы можете визуализировать свою геометрию в порядке, который приводит к меньшему количеству переходов состояний. Вот хороший обзор библиотек графа сцены:

http://www.realityprime.com/articles/scenegraphs-past-present-and-future

2 голосов
/ 08 сентября 2009

Я думаю, что самым простым подходом было бы написать свой собственный класс рендеринга, обернуть все используемые вами функции манипуляции с состоянием OpenGL и вести учет установленных состояний. Вы должны принять во внимание, что изменение разрешения экрана или переключение в полноэкранный режим сделает недействительными ваши текущие состояния и данные контекста рендеринга OpenGL, что означает, что после такого события вам придется устанавливать все состояния, повторно загружать все текстуры и программы шейдеров и т. Д. .

2 голосов
/ 07 августа 2009

Отличный вопрос. Подумайте о том, как работают текстуры. Существует огромное количество текстур для переключения между OpenGL, и вам нужно включить / отключить текстурирование после рисования каждого объекта. Как правило, вы пытаетесь оптимизировать это, рисуя все объекты с одинаковой текстурой одновременно, но все еще происходит значительное переключение состояний. Из-за этого я делаю все возможное, чтобы рисовать все с одним и тем же состоянием одновременно, но я не уверен, насколько это важно - оптимизировать его так, как вы думаете.

Что касается нажатия и выталкивания между режимами трехмерной и двухмерной проекции, то толчок и выталкивание предназначены для использования при иерархическом моделировании. Если вам нужно, чтобы ваша 2D-проекция находилась в местоположении относительно 3D-объекта, во что бы то ни стало, нажмите матрицу и переключитесь в режим 2D-проекции, а затем нажмите, когда закончите. Однако, если вы пишете оверлей 2D-интерфейса с постоянным расположением на экране, я не вижу причин, по которым важно нажимать и выталкивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...