пятница, 20 декабря 2013 г.

Зачем нужны Model, View, Projection матрицы в OpenGL ES



Тот, кто любит ковыряться в исходниках или примерах кода для OpenGL или DirectX (да и вообще для графики), очень часто встречает наличие матриц в шейдере. И чаще всего они имеют похожие названия (а также одну и туже размерность).
Есть три основных типа матриц:

  • Model 
  • View
  • Projection


Обычно путь отрисовки вашей 3D модели (объекта, логически сгруппированных объектов) происходит в несколько этапов:

  • создание (загрузка в память)
  • установка модели в мировом пространстве
  • отрисовка мира в зависимости от положения камеры


Сама по себе модель изначально не привязана к внешнему миру, набор примитивов имеет координаты со смещением относительно условного (0;0;0). 
Нам важно как модель повернута относительно оси X, к примеру, Становится это особенно важно, когда в память загружается набор примитивов один раз, а таких объектов в мире, например, пять штук. И мы хотим их поворачивать относительно собственной оси симметрии на разные углы.
Тут то и вступает в дело Model матрица. В ней то и указывается этот поворот относительно нашей выбранной оси. Она переводит локальные координаты модели в координаты нашего мира.

Так как у нас есть камера, соответственно мы можем ее поворачивать, вращать, ставить в другое место в нашем мировом пространстве. View матрица переводит координаты нашего мира в координаты камеры.

Запускаем мы графику на разных аппаратных платформах, соответственно могут быть разные экраны, разрешения экранов. Projection матрица переводит координаты камеры в координаты для отображения на экране.


В шейдер эти три матрицы передают как первоначальные параметры. Чтобы получить конечную точку модели на экране эти матрицы перемножают.

Очевидно, что если камера не крутится и не двигается, а соотношение и размер экрана не меняется, то произведение View и Projection матриц равно константе для каждого фрейма. И нет особой необходимости пересчитывать их в каждом кадре в шейдере. Поэтому часто их произведение один раз рассчитывают на CPU, а шейдеру отправляют уже готовый результат, что уменьшает расчеты, увеличивает производительность.

Можно встретить такие название переменных для матриц:
mvp, ViewProjection

mvp - это готовое произведение ModelViewProjection


Ну и мой вопрос по теме с ответом на StackOverFlow, за который я получил там золотой баджик :-)




Комментариев нет:

Отправить комментарий