Когда вы изучаете 3D-программирование, вас учат, что проще всего думать о трех матрицах преобразования:
-
Модельная матрица. Эта матрица индивидуальна для каждой модели, и она вращается и масштабирует объект по своему желанию и, наконец, перемещает его в свое конечное положение в вашем 3D-мире. "Модельная матрица преобразует координаты модели в мировые координаты".
-
Матрица просмотра. Эта матрица обычно одинакова для большого количества объектов (если не для всех), и она вращает и перемещает все объекты в соответствии с текущей "позицией камеры". Если вы визуализируете, что трехмерная сцена снимается камерой, а то, что отображается на экране, - это изображения, которые были захвачены этой камерой, местоположение камеры и направление ее просмотра определяют, какие части сцены видны и как объекты появляются на захваченном изображении. Есть мало причин менять матрицу представления при рендеринге одного кадра, но они действительно существуют (например, путем рендеринга сцены в два раза и изменения матрицы просмотра между ними, вы можете создать очень простое, но впечатляющее зеркало в вашей сцене), Обычно матрица просмотра изменяется только один раз между двумя кадрами. "Матрица представления преобразует мировые координаты в координаты глаз".
-
Матрица проецирования. Проекционная матрица решает, как эти 3D-координаты отображаются в 2D-координаты, например. если к ним применена перспектива (объекты становятся меньше, чем дальше от зрителя) или нет (ортогональная проекция). Проекционная матрица почти не меняется вообще. Возможно, это изменится, если вы визуализируетесь в окне, и размер окна изменился, или если вы выполняете полный экран, и разрешение изменилось, однако только в том случае, если новый размер окна/разрешение экрана имеет другой формат отображения, чем раньше. Есть некоторые сумасшедшие эффекты для того, что вы можете захотеть изменить эту матрицу, но в большинстве случаев ее довольно постоянную для всей жизни вашей программы. "Матрица проекции преобразует координаты глаз в координаты экрана".
Это делает для меня весь смысл. Конечно, всегда можно объединить все три матрицы в одну, поскольку умножение вектора сначала на матрицу A
, а затем на матрицу B
совпадает с умножением вектора на матрицу C
, где C = B * A
.
Теперь, если вы посмотрите на классический OpenGL (OpenGL 1.x/2.x), OpenGL знает матрицу проецирования. Однако OpenGL не предлагает модель или матрицу представлений, она предлагает только комбинированную матрицу модели. Почему? Эта конструкция заставляет вас постоянно сохранять и восстанавливать "матрицу просмотра", так как она будет "разрушена" с помощью преобразований модели, примененных к ней. Почему нет трех отдельных матриц?
Если вы посмотрите на новые версии OpenGL (OpenGL 3.x/4.x) и не используете классический конвейер рендеринга, но настройте все с помощью шейдеров (GLSL), матриц больше нет, вы должны определить свои собственные матрицы. Тем не менее, большинство людей придерживается старой концепции проекционной матрицы и матрицы модели. Зачем вам это делать? Почему бы не использовать три матрицы, что означает, что вам не нужно постоянно сохранять и восстанавливать матрицу просмотра модели или использовать единую комбинированную модель-представление-прогноз (MVP), которая сохраняет вам матричное умножение в вашем вершинном шейдере для рендеринга одиночной вершины (ведь такое умножение также не приходит бесплатно).
Итак, чтобы подвести итог моему вопросу: какое преимущество имеет комбинированная матрица модельного представления вместе с отдельной матрицей проектирования с тремя отдельными матрицами или одной матрицей MVP?