Тот, кто любит ковыряться в исходниках или примерах кода для OpenGL или DirectX (да и вообще для графики), очень часто встречает наличие матриц в шейдере. И чаще всего они имеют похожие названия (а также одну и туже размерность).
Есть три основных типа матриц:
- Model
- View
- Projection
Обычно путь отрисовки вашей 3D модели (объекта, логически сгруппированных объектов) происходит в несколько этапов:
- создание (загрузка в память)
- установка модели в мировом пространстве
- отрисовка мира в зависимости от положения камеры
Сама по себе модель изначально не привязана к внешнему миру, набор примитивов имеет координаты со смещением относительно условного (0;0;0).
Нам важно как модель повернута относительно оси X, к примеру, Становится это особенно важно, когда в память загружается набор примитивов один раз, а таких объектов в мире, например, пять штук. И мы хотим их поворачивать относительно собственной оси симметрии на разные углы.
Тут то и вступает в дело Model матрица. В ней то и указывается этот поворот относительно нашей выбранной оси. Она переводит локальные координаты модели в координаты нашего мира.
Так как у нас есть камера, соответственно мы можем ее поворачивать, вращать, ставить в другое место в нашем мировом пространстве. View матрица переводит координаты нашего мира в координаты камеры.
Запускаем мы графику на разных аппаратных платформах, соответственно могут быть разные экраны, разрешения экранов. Projection матрица переводит координаты камеры в координаты для отображения на экране.
В шейдер эти три матрицы передают как первоначальные параметры. Чтобы получить конечную точку модели на экране эти матрицы перемножают.
Очевидно, что если камера не крутится и не двигается, а соотношение и размер экрана не меняется, то произведение View и Projection матриц равно константе для каждого фрейма. И нет особой необходимости пересчитывать их в каждом кадре в шейдере. Поэтому часто их произведение один раз рассчитывают на CPU, а шейдеру отправляют уже готовый результат, что уменьшает расчеты, увеличивает производительность.
Можно встретить такие название переменных для матриц:
mvp, ViewProjection
mvp - это готовое произведение ModelViewProjection
Ну и мой вопрос по теме с ответом на StackOverFlow, за который я получил там золотой баджик :-)
Комментариев нет:
Отправить комментарий