Справка OpenGL glMatrixMode - PullRequest
       5

Справка OpenGL glMatrixMode

5 голосов
/ 02 марта 2011

Я начинаю немного работать над OpenGL и вижу множество примеров, которые вызывают функции glMatrixMode.

Исходя из того, что я понял, установка этого параметра в GL_MODELVIEW или GL_PROJECTION (и т. Д.) Активирует эту конкретную матрицу преобразования, и все последующие вызовы функций преобразования матрицы (glTranslatef, glPushMatrix, glLoadIdentity, glLoadMatrix и т. Д.) Будут влиять натолько активная матрица.

Чего я не понимаю, так это почему 3 (в некоторых случаях 4) разных матриц?Какой из них я должен использовать?(Я, вероятно, собираюсь получить много «Использовать шейдеры», но я не могу. Ограничено школой ...) Когда я должен переключиться и активировать другую матрицу?В чем выгода использования всех из них по сравнению с использованием только одного?

Спасибо за любую помощь:)

Ответы [ 4 ]

8 голосов
/ 02 марта 2011

glMatrixMode не «активирует» матрицы. Фиксированный конвейер OpenGL использует 3 матрицы (иногда 4): две отвечают за преобразование геометрии, одну за преобразование текстурного пространства (и некоторые реализации, одну за корректировку цвета). Эти матрицы используются постоянно.

Матрица modelview используется для перемещения геоемтрии. Поскольку в OpenGL нет «камеры», зритель позиционируется путем перемещения всей геометрии в направлении, противоположном (= обратному) движениям «камеры».

Матрица projection используется для преобразования геометрии из пространства просмотра модели в пространство клипа, т.е. проецирует преобразованную геометрию в область просмотра.

Матрица текстура преобразует координаты текстуры. В случае, если (s, t, r, q) даны напрямую, преимущество этой матрицы на первый взгляд не ясно. Но OpenGL также позволяет генерировать текстурные координаты из позиций вершин. Это вместе с текстурной матрицей позволяет реализовать проекционные текстуры .

Матрица color используется редко и даже не доступна во всех реализациях (она является частью расширения). Если доступно, он преобразует цвета входящих вершин. Так как не существует неявных генераторов цвета, что тогда использовать? Ну, это может быть использовано для преобразования между линейными цветовыми пространствами, например, RGB-> XYZ или любое другое преобразование цветового пространства, которое может быть выражено в виде матрицы скаляров. В наши дни никто не использовал цветовую матрицу, шейдеры делают работу намного лучше.

glMatrixMode есть, чтобы не было переполнения функций. В противном случае вам понадобится:

glModelviewLoadIdentity
glModelviewLoadMatrix
glModelviewMultMatrix
glModelviewRotate
glModelviewTranslate
glModelviewScale
glModelviewPushMatrix
glModelviewPopMatrix

glProjectionLoadIdentity
glProjectionLoadMatrix
glProjectonMultMatrix
glProjectionRotate
glProjectionTranslate
glProjectionScale
glProjectionPushMatrix
glProjectionPopMatrix

и так далее. Также вы не можете использовать такие функции, как glFrutum как в матрицах проекций, так и в матрицах текстур. Вам тоже понадобятся два из них.

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

5 голосов
/ 02 марта 2011

Вы будете использовать все это, если будете использовать конвейер с фиксированной функцией (т. Е. «Без шейдеров»).Фактически, вы будете использовать их и с шейдерами, но в этом случае вы сами их внедрите.

Эта часть OpenGL поначалу может быть трудна для понимания, хотя на самом деле она довольно проста.Когда вы выбираете конкретную матрицу, то это ничего не включает и не выключает.Все, что он делает, - это заставляет функции, подобные glTranslatef, работать с одной конкретной матрицей, которую вы выбрали.

OpenGL работает так везде (кроме прямого доступа к состоянию), например, с текстурами и буферами втак же.

РЕДАКТИРОВАТЬ: Что касается того, почему есть несколько матриц, они все делают разные вещи.Ваши модели обычно находятся в «собственном пространстве», что означает, что их нужно каким-то образом перенести в «мир», масштабируя их соответствующим образом и переводя в нужное место.Тогда все (весь «мир») необходимо преобразовать в соответствии с вашим «положением глаз», и оно должно быть преобразовано в «нормализованное» пространство клипа, потому что именно так аппаратное обеспечение может быть реализовано наиболее эффективно.и т. д., и т. д. и т. п.

Все эти матрицы обычно умножаются вместе (без вашего ведома, что это происходит).
Если вы заглянете в конвейер преобразования opengl , вы получитемного хороших ресурсов, которые объясняют, что происходит, когда подробно, например, this .

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

1 голос
/ 02 марта 2011

Вероятно, вы просто будете использовать glMatrixMode(GL_PROJECTION) один раз, а затем gluPerspective() (или, может быть, glOrtho()), чтобы указать, как будет выполняться проекция.Не часто встречается изменение перспективы после установки.

Затем вы переключаетесь на GL_MODELVIEW и просто используете его, чтобы вращать / переводить / масштабировать вещи вокруг.Обе матрицы используются при рендеринге, будучи конечной позицией на экране = GL_PROJECTION * GL_MODELVIEW * вашей вершины.Но поскольку GL_MODELVIEW должен меняться гораздо чаще, чем GL_PROJECTION, они разделены спецификацией.

0 голосов
/ 02 марта 2011

Это потому, что умножение матриц не является коммутативным. Если бы у вас был только один матричный режим, новое преобразование всегда происходило бы после всех существующих, и это не всегда желательно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...