Когда вы изучаете 3D программирования, вас учат, что это самый простой думать в терминах матриц 3 преобразования:Почему было бы выгодно иметь отдельную матрицу проекции, но комбинировать модель и матрицу просмотра?
матричная модель. Эта матрица индивидуальна для каждой модели, и она вращается и масштабирует объект по своему желанию и, наконец, перемещает его в свое конечное положение в вашем 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?
Очень хорошо подробный вопрос. – JCM