2015-12-30 5 views
1

Можно ли определить текущий режим матрицы, используемый OpenGL?Текущий режим матрицы OpenGL

Например, я в настоящее время имеют следующие (запускаемого размеров окна):

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-width, width, -height, height, -1.0, 1.0); 
glMatrixMode(GL_MODELVIEW); 

Однако предпочтительнее, чтобы вернуться в режим ранее используемой матрицы, а не предполагать GL_MODElVIEW. Есть ли функция, которая может быть вызвана заранее, чтобы сохранить предыдущее состояние?

+0

Почему вы ожидаете, что текущий режим матрицы будет чем-то другим, кроме 'GL_MODELVIEW'? – Kos

+1

@ Kos Учитывая, что доступны четыре различных режима матрицы, я предполагаю, что любой из них может использоваться, когда происходит событие изменения размера. Хотя я не ожидал этого, я думаю, что это хорошо, по крайней мере, рассмотреть возможность. Это, как говорится, я новичок в этом, и поэтому это может быть не так. – nwn

+0

Я не покупаю. У вас есть N мест в коде, которые ожидают, что «матричный режим должен быть таким, каким я его оставил», и M-местами, которые говорят «я должен оставить режим матрицы нетронутым»? Это кажется слишком сложным. Я бы лучше посмотрел на весь цикл рендеринга и установил соглашение, какой режим должен быть установлен на тех этапах рендеринга. – Kos

ответ

5

Получение точного значения с помощью glGetIntegerv(GL_MATRIX_MODE, ...) - очевидный ответ.

Однако, есть более элегантный и, скорее всего, более эффективный способ. Legacy OpenGL имеет стек атрибутов, который позволяет сохранять/восстанавливать значения атрибутов без использования каких-либо вызовов glGet*(). В этом примере вы можете использовать:

glPushAttrib(GL_TRANSFORM_BIT); 
// Code that modifies transform mode. 
glPopAttrib(); 

Вы можете посмотреть, какой бит передается glPushAttrib() сохраняет какое состояние в таблице на man page.

Обычно вы должны избегать вызовов glGet*(), так как они могут быть вредными для производительности. В конкретном примере, когда вы выполняете код только при изменении размера окна, это, очевидно, не вызывает беспокойства. Но в коде, который выполняется часто, это становится намного более критичным.

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

+0

Спасибо, этот ответ более полный и поучительный.Я не знал о проблемах с производительностью 'glGet *', но стек все равно чист. К сожалению, для этого проекта требуется LegacyGL. – nwn

+0

@watarok: Ну, стек атрибутов является частью устаревшего OpenGL. Он удален из современного OpenGL – datenwolf

+0

@RetoKoradi: Один недостаток стека атрибутов - это то, что он может переполняться. Поэтому, если вы пишете, скажем, подключаемый модуль, вы можете оказаться в ситуации, когда нет стека атрибутов. Простая, надежная версия использует glGet. Но можно протестировать переполнение стека (glGetError) при нажатии на стек атрибута и вернуться к glGet, если первое не удается. – datenwolf