Почему в OpenGL есть glMatrixMode?

Я просто не понимаю, для чего нужен OpenGL glMatrixMode.

Насколько я вижу, когда вызывается glMatrixMode(GL_MODELVIEW), за ним следуют glVertex, glTranslate, glRotate и тому подобное, то есть команды OpenGL, которые размещают какие-то объекты где-то в пространстве. С другой стороны, если вызывается glOrtho, glFrustum или gluProjection (т.е. то, как размещенные объекты рендерятся), ему предшествует вызов glMatrixMode(GL_PROJECTION).

Я предполагаю, что то, что я написал до сих пор, является предположением, относительно которого кто-то докажет мою неправоту, но это не смысл использования разных Матричных режимов именно потому, что существуют разные виды gl-функций: связанных с размещением объектов и тем, как эти объекты отображаются?


person René Nyffenegger    schedule 30.12.2010    source источник
comment
Обратите внимание, что теперь это устарело, и вы должны использовать только шейдеры и явные униформы, начиная с OpenGL 3.1. Например, OpenGL ES 2.0 вообще не поддерживает glMatrixMode() и подобные. (Ну, конечно, если у вас нет большого количества кода, который делает это, и/или вам не нужно поддерживать старое оборудование/драйверы.)   -  person Macke    schedule 31.12.2010
comment
И glVertex следовало считать устаревшим, начиная с OpenGL 1.0. :)   -  person Kos    schedule 31.12.2010
comment
Когда вы упоминаете что-то как устаревшее, пожалуйста, также укажите, что является современной заменой, потому что без этого это не очень информативно.   -  person SasQ    schedule 07.01.2015
comment
@Kos из OpenGL 1.1 скорее. Только тогда появилась первая альтернатива — glDrawArrays.   -  person Ruslan    schedule 06.07.2016


Ответы (4)


Это просто, и на него можно ответить очень кратко:

  • Отрисовка вершин (как в glVertex ) зависит от текущего состояния матриц, называемых "матрица представления модели" и "матрица проекции",

  • Команды glTranslatef, glPushMatrix, glLoadIdentity, glLoadMatrix, glOrtho, gluPerspective и все семейство влияют на текущую матрицу (любую из перечисленных выше),

  • Команда glMatrixMode выбирает матрицу (модель-вид или проекция), на которую влияют вышеупомянутые команды.

(Кроме того, для координат текстуры используется матрица текстуры, но она используется редко.)

Таким образом, общий вариант использования:

  • иметь активную матрицу представления модели большую часть времени,
  • всякий раз, когда вам нужно инициализировать матрицу проекции (обычно в начале или, возможно, при изменении размера окна), переключите активное значение на проекцию, настройте перспективу и вернитесь к представлению модели.
person Kos    schedule 31.12.2010
comment
Вы должны всегда переустанавливать (то есть сбрасывать новую) матрицу проекции каждый раз, когда вы проходите полный проход дисплея. В любом случае вам придется использовать несколько разных проекций для любого реального приложения. Например, для рендеринга HUD в игре вы должны использовать другую проекцию, чем для самой сцены. OpenGL не знает инициализации, кроме получения контекста, поэтому, пожалуйста, забудьте о том, чтобы что-то делать где-то один раз или делать этот глупый шаблон, устанавливающий проекцию в обработчике изменения формы. - person datenwolf; 01.01.2011
comment
@datenwolf - Верно, но push/popMatrix в матрице проекции для 2D-наложений работает так же хорошо, так что это не большая разница. - person Kos; 01.01.2011
comment
Странно то, что я не могу представить, как glOrtho или gluPerspective можно использовать для чего-то другого, кроме матрицы проекции, а glTranslate, glRotate и другие преобразования использовать для матрицы проекции, так почему же функции для настройки проекции не выбирают проекционная матрица внутри? Думаю, это избавит пользователей от головной боли и защитит от идиотов. Функции, которые можно вызывать на любой матрице, по-прежнему могут использовать выбор режима, как и раньше. - person SasQ; 07.01.2015
comment
это видео помогает понять интуитивное представление матриц модели-вида-проекции. youtube.com/watch?v=uQNU5XICGvw - person bicepjai; 12.09.2015

Вы также можете использовать glRotate и glTranslate для проекционных матриц.

Также: OpenGL поддерживает преобразование текстур и цветов. Если вы активируете эту функцию, вы можете, например, изменить координаты текстуры объекта, не перезаписывая координаты текстуры в каждом кадре (медленно).

Это очень полезная функция, если вы хотите прокрутить текстуру по объекту. Все, что вам нужно сделать для этого, это нарисовать текстурированный объект, установить режим матрицы на GL_TEXTURE и вызвать glTranslate, чтобы установить смещение в текстуре.

person Nils Pipenbrinck    schedule 30.12.2010
comment
Кроме того, проективные матрицы текстур используются с тенями и проецируемыми текстурами (прожекторы сцены, фары, дискотеки, кинопроекторы и т. Д.) ... - person Macke; 31.12.2010

Как отметил Нильс, у вас есть больше матриц, чем то, что вы упомянули.

Добавлю пару мыслей:

  • Ядро OpenGL (начиная с версии 3.1) полностью избавляется от всех матричных вещей, как и GL ES 2.0. Это просто из-за того, что шейдерные программы убрали большую часть требований, предъявляемых к ним на уровне GL (хотя это все еще удобно). Тогда у вас есть только униформы, и вы должны полностью вычислить их значение на стороне клиента.

  • Существует больше точек входа для манипулирования матрицами, чем вы упомянули. Некоторые из них одинаково хорошо применимы к проекции/виду модели (glLoadIdentity/glLoadMatrix/glMultMatrix, Push/Pop). Они очень полезны, если вы хотите самостоятельно выполнить вычисление матрицы (например, потому что они вам нужны где-то еще в вашем приложении).

person Bahbar    schedule 31.12.2010
comment
Убрать со всеми этими матричными вещами не совсем точно. Умножение матриц по-прежнему является способом применения преобразований к координатам вершин. Разница в том, что это больше не фиксированная функция в конвейере, а полностью управляемая программируемыми шейдерами. - person Ben Voigt; 18.04.2014

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

Вызов glMatrixMode перед генерацией геометрии не имеет никакого эффекта. Вы вызываете glMatrixMode перед редактированием матрицы преобразования, чтобы определить, где в общей последовательности появляются эти изменения.

(NB: просмотр последовательности имеет гораздо больше смысла, если вы помните, что перемещение и вращение не коммутативны, потому что перемещение изменяет центр вращения. Точно так же перемещение и масштабирование не являются коммутативными.)

person Ben Voigt    schedule 30.12.2010