Почему лучше явно управлять матрицами в OpenGL? - PullRequest
6 голосов
/ 20 октября 2011

В последнее время я довольно много возился с OpenGL, и я столкнулся с разрывом между тем, что OpenGL может управлять матрицами вида / модели / проекции или управлять ими самостоятельно, либо с помощью собственной реализации матрицы, либо с помощью такой библиотеки.как GLM.Я видел, что у многих крупных проектов есть собственное управление камерой (то есть управление собственными переводами, поворотами и т. Д.).Я понимаю, почему это поможет убедиться в том, что у вас есть полный контроль над системой, но помимо этого, похоже, много работы для получения минимального выигрыша.

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

(Это применимо к любой 3D-библиотеке).

Ответы [ 3 ]

7 голосов
/ 20 октября 2011

(Кроме того, OpenGL ES 2 не имеет средства управления преобразованиями, поэтому в некоторых случаях у вас нет выбора.)

Более подробно, я нашел управление матрицами через встроенные в OpenGL стеки матриц.порой быть настоящей болью, вынуждая меня толкать и вставлять довольно обильно в более сложные части моего кода рендеринга, даже иногда переупорядочивать рендеринг просто для упрощения управления стеками.Я также написал C ++ pusher-popper class, который использует RAII для автоматического управления всем этим, но требует тщательной проверки локальных переменных.

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

3 голосов
/ 20 октября 2011

Это лучше по большому списку причин.Недавняя презентация Apple об улучшениях OpenGL в OSX Lion говорит об этом лучше: новые спецификации OpenGL (в основном версии 3.2 и выше) лучше ориентированы на представление того, что на самом деле делает GPU.В OpenGL 2.1 все матричные операции выполняются на процессоре.Таким образом, не только нет волшебного ускоренного преимущества использования матриц GL, вы ограничены совершенно произвольной моделью управления матрицами: только матрицы проекций и просмотра моделей (для вершин), ограничения размера стека матриц, ограниченный набор матричных операций.и т. д.

Когда вы начинаете управлять своими собственными матрицами, вы начинаете понимать, почему это намного лучше.По мере того, как ваши сцены усложняются, вы начинаете видеть потребность в большем количестве матричных кэшей (помимо просто «проекции» и «представления модели»).Вы открываете возможности для создания более полезных матричных функций.Например, что звучит более приятно для использования?glRotatef(90.0f, 1.0f, 0.0f, 0.0f); или matrix.rotateX(90.0f);?Меня всегда беспокоило, что мне приходилось указывать ось вращения каждый раз!

Когда вы начнете распознавать разницу между операциями ЦП и ГП, вы по достоинству оцените управление своими собственными матрицами.

1 голос
/ 20 октября 2011

GL-управляемый матричный стек устарел в последних оборотах. спецификации OpenGL. Таким образом, управление ими самостоятельно - это опция only .

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