#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. Просто для подтверждения, поэтому проекционная матрица просто преобразует / масштабирует модель, но координата / размер ячейки остаются неизменными в мире?