Почему проекционная матрица может корректно корректировать координаты?

#android #graphics #opengl-es

#Android #графика #opengl-es

Вопрос:

Я видел, что в руководстве по разработке OpenGL ES для Android сказано «…Проекционная матрица пересчитывает координаты вашей графики, чтобы они правильно отображались на экранах устройств Android. »

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

Может ли кто-нибудь объяснить это простым языком, не привлекая слишком много фона компьютерной графики?

Проблема с рендерингом на телефоне

Ответ №1:

Если вы нацелены на OpenGL ES 1.0, существует конвейер с фиксированной функцией OpenGL. И здесь у нас есть GL_PROJECTION и стеки GL_MODELVIEW матриц (на самом деле есть еще один для текстурных операций, но здесь это не имеет значения).

Что происходит, так это то, что конвейер с фиксированной функцией просто объединяет / умножает верхнюю матрицу этих двух стеков матриц (давайте будем называть их как P и MV для матрицы проекции и матрицы представления модели соответственно), как P * MV во время каждого вызова рисования, и преобразует любую нарисованную вершину v на P * MV * v .

Когда вы настраиваете OpenGL ES 2.0 или выше, таких стеков матриц с фиксированной функцией больше нет, но вы будете использовать шейдеры и загружать свои собственные матрицы (например, в виде униформы или другими способами). Там вы полностью свободны в отношении того, как вы разлагаете окончательное преобразование (ранее P * MV в конвейере с фиксированной функцией). В конце концов, все, что вы хотите сделать, это преобразовать вершины из их пространства (обычно называемого «пространством модели») в координаты «пространства клипов». Пространство клипа — это единственное, о чем действительно заботится OpenGL ES 2.0 (или выше).

Просто разложение конечной матрицы (модель -> пространство клипа) на матрицы проекции, представления и модели удобно из-за частоты, с которой они меняются во время рендеринга всей сцены. Проекционная матрица обычно содержит только те преобразования, которые остаются постоянными и должны обновляться только при изменении размера окна (или перенастройке вертикального поля зрения). То есть эта матрица преобразуется из «пространства просмотра» в «пространство клипа» и представляет внутренние свойства камеры.

Теперь, в большинстве случаев существует также специальная матрица «вид», которая представляет внешние свойства камеры, которая обычно является положением и ориентацией камеры в мире. Таким образом, эта матрица изменяется при повороте / перемещении виртуальной камеры. И эта матрица преобразуется из пространства «модель» в пространство «вид».

Далее будут матрицы моделей, которые представляют преобразования каждой модели в мире.

И, наконец, когда вы хотите что-либо отобразить, вы должны использовать разложение P * V * M (матрица проекции, умноженная на матрицу представления, умноженную на матрицу модели) для преобразования вершины по всей цепочке модель -> пространство клипов.

Теперь к вопросу о том, почему мы выполняем масштабирование в проекционной матрице:

Причина в том, что когда вы находитесь в пространстве просмотра (после преобразования GL_MODELVIEW или вашего пользовательского V * M преобразования), у вас есть пространство, оси которого выровнены с экраном. Итак, вы знаете, что масштабировать (оси X или Y) и на сколько. Вы не можете просто масштабировать модель, поскольку ее также можно поворачивать и переводить произвольно.

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

1. Просто для подтверждения, поэтому проекционная матрица просто преобразует / масштабирует модель, но координата / размер ячейки остаются неизменными в мире?