Почему выгодно иметь отдельную матрицу проекций, но при этом комбинировать модель и матрицу представления?

Когда вы изучаете трехмерное программирование, вас учат, что проще всего думать с точки зрения трех матриц преобразования:

  1. Матрица модели. Эта матрица индивидуальна для каждой отдельной модели, она вращает и масштабирует объект по желанию и, наконец, перемещает его в конечное положение в вашем трехмерном мире. «Матрица модели преобразует координаты модели в мировые координаты».

  2. Матрица представления. Эта матрица обычно одинакова для большого количества объектов (если не для всех), и она вращает и перемещает все объекты в соответствии с текущим «положением камеры». Если вы представляете себе, что 3D-сцена снята камерой, а то, что отображается на экране, — это изображения, снятые этой камерой, то расположение камеры и направление ее взгляда определяют, какие части сцены видны и как расположены объекты. появляются на захваченном изображении. Причин для изменения матрицы вида при рендеринге одного кадра немного, но они действительно существуют (например, дважды визуализируя сцену и изменяя матрицу вида между ними, вы можете создать очень простое, но впечатляющее зеркало в своей сцене). . Обычно матрица вида меняется только один раз между двумя отрисовываемыми кадрами. «Матрица просмотра преобразует мировые координаты в координаты глаза».

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

Для меня это имеет большой смысл. Конечно, всегда можно объединить все три матрицы в одну, поскольку умножение вектора сначала на матрицу A, а затем на матрицу Bравносильно умножению вектора на матрицу . ] C, где C = B * A.

Теперь, если вы посмотрите на классический OpenGL (OpenGL 1.x/2.x), OpenGL знает матрицу проекции. Тем не менее, OpenGL не предлагает модель или матрицу представления, он предлагает только комбинированную матрицу модель-представление. Почему?Этот дизайн вынуждает вас постоянно сохранять и восстанавливать «матрицу вида», поскольку она будет «уничтожена» примененными к ней преобразованиями модели. Почему нет трех отдельных матриц?

Если вы посмотрите на новые версии OpenGL (OpenGL 3.x/4.x) и вы не используете классический конвейер рендеринга, а настраиваете все с помощью шейдеров (GLSL), больше нет доступных матриц, вам нужно определить свои собственные матрицы. Тем не менее, большинство людей придерживаются старой концепции проекционной матрицы и матрицы модели-представления. Зачем это делать?Почему бы не использовать три матрицы, что означает, что вам не нужно постоянно сохранять и восстанавливать матрицу представления модели или использовать одну комбинированную модель, представление и проекцию (MVP) matrix, который экономит умножение матриц в вашем вершинном шейдере для каждой визуализируемой вершины (в конце концов, такое умножение тоже не бесплатно).

Итак, резюмируя мой вопрос: какое преимущество имеет комбинированная матрица модели-представления вместе с отдельной матрицей проекций по сравнению с тремя отдельными матрицами или одной матрицей MVP?

48
задан Mecki 16 May 2012 в 11:29
поделиться