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

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

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

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

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Я добавлю пару соображений:

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

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

Ответ 4

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

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

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