Для произвольного количества преобразований в OpenGL ES 2.0, где вы вычисляете модели и матрицы представления?

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

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

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

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

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

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

person Ian Terrell    schedule 13.07.2011    source источник


Ответы (1)


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

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

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

person datenwolf    schedule 13.07.2011