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