Для произвольного числа преобразований в OpenGL ES 2.0, где вы рассчитываете модель и просматриваете матрицы? - PullRequest
0 голосов
/ 13 июля 2011

Я пишу небольшой 2D игровой движок в OpenGL ES 2.0.Это работает, но для сцен среднего размера кажется немного вялым в настоящее время.Я разработал его так, чтобы каждый игровой объект представлял собой дерево узлов, а каждый узел - примитивную форму (треугольник, квадрат, круг).И каждый узел может иметь произвольный набор преобразований, примененных к нему при создании, а также во время выполнения.

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

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

Похоже, это хорошая вещь, чтобы по возможности подтолкнуть GPU, но, поскольку анимации применяются динамически, я не знаю заранее, сколькопреобразования каждый узел будет проходить для того, чтобы написать шейдер для обработки.Я новичок в OpenGL ES 2.0 и дизайне игрового движка и не знаю всех ограничений.

Мои вопросы ...

  1. Я радикально не согласен с "хороший "дизайн игрового движка?
  2. Это действительно задача для процессора или графического процессора?
  3. Можно ли написать шейдер OpenGL 2.0 ES для обработки произвольного числа преобразований, которые соответствуют моему"Дерево объектов "Матрицы проектирования и применения во время выполнения?

1 Ответ

2 голосов
/ 13 июля 2011

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

Вы должны действительно оптимизировать работу анимации. Например, вам не нужно 3 матрицы на узел. Одна матрица содержит целое преобразование. Каждое матричное умножение 4 × 4 включает в себя 64 умножения с плавающей запятой. Таким образом, у вас есть 64⁴ умножения для каждого узла. Прекрати это!

Хороший способ оптимизировать систему анимации - разделить отдельные параметры. Используйте кватернио для вращения; кватернионы принимают только 8 скалярных умножений, сохраняют перевод как 3 вектора, то же самое с масштабированием. Затем составьте одну матрицу преобразования из этих частей. Вы можете перевести кватернион непосредственно в верхнюю левую часть 3 × 3, описывающую вращение, используя вектор масштабирования в качестве коэффициента для столбцов. Перевод идет в 4-й ряд. Элемент 4,4 равен 1.

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