Почему в OpenGL есть glMatrixMode? - PullRequest
12 голосов
/ 31 декабря 2010

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

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

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

Ответы [ 4 ]

21 голосов
/ 31 декабря 2010

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

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

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

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

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

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

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

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

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

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

3 голосов
/ 31 декабря 2010

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

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

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

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

2 голосов
/ 31 декабря 2010

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

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

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

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